V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sunbreak
V2EX  ›  Flutter

[Flutter 翻译]Flutter 和桌面应用

  •  
  •   sunbreak · 2020-06-28 09:38:21 +08:00 · 2937 次点击
    这是一个创建于 1370 天前的主题,其中的信息可能已经有所发展或是发生改变。

    副标题:在 Ambient Computing 愿景上的一些进展

    原文地址: https://medium.com/flutter/flutter-and-desktop-3a0dd0f8353e

    原文作者: https://medium.com/@timsneath

    我们对 Flutter 的使命是针对各种各样的设备--包括 iOS 、Android 、Windows 、Linux 、macOS 和 web--从单一的代码库,用原生编译和游戏质量的视觉效果,这不是什么秘密。在谷歌内部,从AssistantStadia,从Cloud SearchBlogger,都有项目使用 Flutter 。而在 Google 之外,Flutter 已经被从ByteDanceGrab,从NubankMGM Resorts等公司采用,他们都从 Flutter 的生产力和灵活性中受益。

    你们中的许多人对包括 Windows 、macOS 和 Linux 在内的桌面操作系统的进展很感兴趣:在调查和 GitHub 上,桌面一再成为最受欢迎的新功能之一。在接下来的几周里,我们将在这里展示更多的工作,我们认为我们应该先调查一下为整个项目做出贡献的各个功能团队的一些工作。虽然桌面支持目前是技术预览版,但我们已经做了大量的工作。

    发布模式

    最近,我们除了现有的对 macOS 的支持外,还支持了WindowsLinux的配置文件和发布模式。例如,如果你正在运行 Flutter 的最新构建,你现在可以用flutter build windows将 Flutter 应用程序编译成 Windows 可执行文件。这使用我们生产的AOT 编译器来创建原生 x64 机器代码,可以分发到没有安装 Flutter 的机器上。

    桌面级体验

    无论你是在构建独立的可执行文件还是 Web 应用程序,构建桌面级体验都有独特的属性。桌面窗口通常是横向模式,并且可以调整大小;输入通常来自物理键盘和鼠标,而不是屏幕上的键盘和触摸;控件针对不同的屏幕密度进行了优化。

    在框架层面,我们对 Flutter 进行了各种改变,以支持桌面类体验。

    • 当你在最近的构建中创建一个新的项目时,你会看到默认模板现在包括一个对visualDensity属性的引用,它允许控件根据它们所针对的平台来调整它们的密度,在桌面平台上的间距更加紧凑。如何使用这个的一个例子是TextField,它现在根据指定的密度提供紧凑、舒适和标准的间距

    • 我们为鼠标和键盘输入添加了更好的支持;这包括 Windows 上的原始键码、鼠标右键、光标变化和滚轮支持。

    • 你现在可以查询特定的平台(通过Platform类),Windows 、macOS 和 Linux 都能提供相应的结果。

    • 在最新的版本中,我们增加了一个NavigationRail小部件,专门为桌面和平板电脑上的桌面类体验而设计。

    FFI

    Dart 团队一直在努力打磨外函数接口(FFI),这是平台集成的一大速度助推器。对于基于 C 语言的 API,dart:ffi库提供了一个直接绑定本地代码的机制; Dart 运行时提供了在堆上分配由 Dart 对象支持的内存,并对动态链接的库进行调用的能力。

    对于一个来自 Windows 的简单例子,这里是一个完全用 Dart 代码调用传统的 Win32 MessageBox() API 的代码片段:

    typedef MessageBoxNative = Int32 Function(
        IntPtr hWnd, Pointer<Utf16> lpText, Pointer<Utf16> lpCaption, Int32 uType);
    typedef MessageBoxDart = int Function(
        int hWnd, Pointer<Utf16> lpText, Pointer<Utf16> lpCaption, int uType);
    
    final user32 = DynamicLibrary.open('user32.dll');
    final win32MessageBox =
        user32.lookupFunction<MessageBoxNative, MessageBoxDart>('MessageBoxW');
    
    void showMessageBox(String message, String caption) => win32MessageBox(
        0,                      // 无主窗口
        Utf16.toUtf16(message), // 消息
        Utf16.toUtf16(caption), // 窗口标题
        0                       // 单 OK 按钮样式
        );
    
    …
    
    showMessageBox('Test Message', 'Window Caption'); // 像其他 Dart 函数一样调用
    

    用 Dart 代码调用 Win32 MessageBox API 。完整的例子在这里

    在这段代码中,我们提供了typedef来表示方法的签名,包括本地和基于 Dart 的表示。有了这些定义,我们可以加载 Windows 动态链接库( DLL ),通过lookupFunction()方法提供函数的实现,将 Dart 函数签名映射到底层的本地入口点。最后,我们有选择地添加一个简单的习惯性包装器,使其易于从其他 Dart 代码中访问,结果是这样的:

    一个使用 Win32 MessageBox API 的简单的 Windows 示例应用程序。

    当然,你不必自己做这项工作:有可能有人已经为你想使用的 API 铺平了道路。你可以在我们的文档中阅读更多关于使用 Flutter 的 FFI 的信息

    更新插件模型

    通过设计,Flutter 本身有一个小的核心。插件和包(无论是直接来自 Flutter 团队还是更广泛的贡献者生态系统)并没有给基础框架增加重量,而是提供与底层操作系统的集成。

    然而,随着 Flutter 越来越多地支持移动、Web 和桌面,为每个支持的平台开发一个插件变得越来越有挑战性。一个插件更有可能需要在每个平台上具有专长的不同作者的贡献。

    一个有用的技术是定义一个通用的接口作为核心插件的一部分,每个平台都可以独立实现。因此,正如最近一篇关于现代插件开发的文章中所描述的那样,我们最近调整了插件的模式,以使平台开发能够更容易地在多个作者之间进行联合。作为这项工作的一部分,现在可以明确声明一个插件支持哪些平台

    我们已经开始使用这个模型构建一些核心插件,你可以在flutter/plugins代码库中找到一些联盟模型的早期例子。

    请注意,Windows 和 Linux 插件的 API 还在不断变化中,所以虽然我们鼓励探索,但目前我们还没有准备好提供通用的生产支持。我们也在努力在 pub.dev 上添加桌面平台标签。

    在 Windows 上运行:Win32 和 UWP

    我们在 Windows 上所做的工作的一个有趣的方面是实验各种架构方法。在任何平台上,Flutter 都被嵌入到一个小型主机容器应用程序("嵌入器")中,使用类似 Unity 等游戏引擎的方法。这个特定于平台的嵌入器提供了一个入口点,与底层操作系统协调,以访问渲染面、可访问性和输入等服务,并管理消息事件循环。

    Windows 为创建这种嵌入器提供了两种不同的方法。首先,可以使用成熟的 Win32 编程模型来创建 Flutter 内容的入口点;这为 Windows 7 等平台提供了最大的向后兼容性,并构建了一个标准的 EXE 文件,许多开发人员都会期待。相反,现代 UWP 应用程序模型是 Windows 10 的推荐方法,并为将 Flutter 支持扩展到 Xbox 或即将推出的Windows 10X操作系统等设备提供了令人感兴趣的机会。

    我们一直在与各种贡献者进行非正式合作,探索这里的不同解决方案,并乐意支持与微软的密切合作,以完成高质量的解决方案。随着 Surface 系列设备扩展到包括 Android 和 Windows,我们认为 Flutter 为微软提供了一个令人信服的平台,以构建跨越其整个产品组合的美丽的本地体验。

    享受桌面的乐趣

    这项工作仍处于技术预览阶段,API 和工具尚未稳定。我们仍在跟踪大量的工作,我们希望在将桌面支持推广到稳定之前完成,包括改进的可访问性和本地化支持。

    如果你想尝试一下,你需要上一个开发频道。Windows 和 Linux 只能在master分支上使用,这是活跃的 Flutter 开发的地方。macOS 可以在dev分支上使用,它稍微稳定一些,但不建议用于生产。你可以用flutter channel masterflutter channel dev切换通道,然后使用这些命令之一来启用对你使用的平台的支持。

    // 在 Windows 上
    C:\flutter> flutter config --enable-windows-desktop
    
    // 在 macOS 上
    $ flutter config --enable-macos-desktop
    
    // 在 Linux 上
    $ flutter config --enable-linux-desktop
    

    我们已经看到一些富有冒险精神的开发者开始利用 Flutter 在桌面上创建应用。我们看到的首批 Flutter macOS 桌面应用之一是Sharezone,这是一款针对德国教育市场的学生计划书,它最初是一款移动应用,但最近增加了网页和桌面版本。

    Sharezone Schulplan--一款为学生、教育工作者和家长提供跟踪作业、学习小组和时间表的应用。

    我们将在未来几周内分享更多关于桌面版支持的信息;与此同时,我们很想听到更多关于您的经验。如果你是一个插件作者,我们鼓励你开始评估工作,以支持这些即将到来的桌面平台;如果你已经发布了一个应用程序,为什么不尝试将其作为桌面应用程序运行,并让我们知道你是进展如何?


    通过 www.DeepL.com/Translator (免费版)翻译

    2 条回复    2020-06-28 10:43:50 +08:00
    carpediemvv
        1
    carpediemvv  
       2020-06-28 10:03:05 +08:00 via iPhone
    牛逼
    sunbreak
        2
    sunbreak  
    OP
       2020-06-28 10:43:50 +08:00
    @carpediemvv 对 Flutter 感兴趣的话,欢迎来头条一起开发 Flutter: https://v2ex.com/t/684705
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2449 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 15:53 · PVG 23:53 · LAX 08:53 · JFK 11:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.