查看原文
其他

Canonical 在 Linux 上提供 Flutter 桌面应用支持

Flutter 谷歌开发者 2021-08-05

作者 / Chris Sells (Google) 和 Ken VanDine (Canonical)


Google 为 Flutter 设置的目标始终不变: 提供便携的工具包,用于构建以原生速度运行的精美 UI,且不受目标平台限制。为了验证这一能力,我们首先着眼于 Android 和 iOS 移动平台。目前在 Google Play 上已有超过 8 万款运行流畅、设计精美的 Flutter 应用发布。


为了在这一成功的基础上再接再厉,一年多来,我们又将重点延伸到桌面级体验,包括 Web 和桌面操作系统: macOS、Windows 和 Linux。这项工作包括对引擎进行大量重构,以支持桌面风格的鼠标键盘输入和可调整大小的顶层窗口。还包括能够很好地适应桌面的新界面功能,比如 Material Density (Material 内容密度) 和 NavigationRail,通过 Dart:FFI 与底层桌面操作系统达成深度集成,以及对系统菜单栏与标准对话框的访问。所有工作都是为了确保 Flutter 除了适用于移动体验之外,还可以处理全功能、全尺寸的桌面应用。


  • NavigationRail
    https://api.flutter.cn/flutter/material/NavigationRail-class.html
  • Dart:FFI
    https://dart.cn/guides/libraries/c-interop

我们一直致力于让 Flutter 为各平台提供动力。在 Google 的 Assistant 等产品上,这一点已经有所体现。现在,我们很高兴有更多公司使用 Flutter 来为更多平台赋能。我们很荣幸与全球最流行的桌面 Linux 发行版 Ubuntu 的发行商 Canonical 一起,共同宣布推出 Flutter 的 Linux alpha 版。

  • Ubuntu

    https://ubuntu.com/



为什么在 Linux 上推出 Flutter?


去年,当 Google 宣布 Flutter 支持桌面级应用时,Canonical 决定抓住这个机会,将包括 Ubuntu 在内的 Linux 发行版打造成 Flutter 应用开发者喜爱的目标平台。Flutter 的原生跨平台之旅正在如火如荼地开展,而 Canonical 希望成为开路先锋。得益于在 Flutter 中实现的桌面 Linux 支持,Canonical 让应用开发者可通过 Linux 的应用商店 Snap Store 向 Linux 用户轻松发布应用。Canonical 将 Linux 打造成一流的 Flutter 平台,并邀请 Flutter 应用开发者向数百万 Linux 用户发布自己的作品,从而为用户们带来更多高品质的应用。


Flutter 为 Canonical 提供的价值:

  • 快速增长的应用开发者生态系统
  • 多平台支持
  • 高度优化的原生应用
  • 现代化的界面框架,支持声明式 (declarative)、响应式 (reactive) 以及可组合 (composable) 的 widget
  • 通过 Visual Studio Code、Android Studio 和 IntelliJ 提供丰富的开发平台

在 Google 最初宣布的 Flutter 桌面支持中,首先是支持 macOS 的 alpha 版本,对于 Linux 和 Windows 仍处于计划阶段。Canonical 在 Flutter 中进行了大量投资,专门成立了一支开发者团队,与 Google 的开发者一起为大多数 Linux 发行版带来最佳的 Flutter 体验。Canonical 将继续与 Google 合作,进一步完善 Linux 支持,并使其功能与其他支持的平台保持同步。


Flokk 应用: Flutter 已为桌面系统做好准备


为了证明 Flutter 已为桌面系统做好准备,我们与 gskinner 的设计师和开发者合作,打造出创新性的精美 Flutter 桌面应用: Flokk。这是一款已经正式发布的应用,它使用真实的数据,比如您的 Google 通讯录列表。

  • gskinner
    http://gskinner.com/
  • 将 Flutter 带到 Linux 中: Flokk Contacts
    https://www.bilibili.com/video/BV17f4y1R7vG/


除了搜索、添加和编辑联系人等管理功能外,Flokk 还可以让您关联 GitHub 和 Twitter 来处理联系人信息。
△ Flokk Contacts 应用由 Flutter 打造,在桌面运行
通过显示 GitHub 和 Twitter 通知,您的联系人列表就成为了强大的个人社交网络。如果您在 Flokk Contacts 中没有看到自己想连接的社交网络,不用担心: Flokk 是完全开源的,您可以提交 PR 让其添加您心仪的社交网络。

  • GitHub: Flokk
    https://github.com/gskinnerTeam/Flokk/


除了在社交领域创新,Flokk 还使用 Flutter 功能提升观感。以下图为例,深色主题不是单纯地切换颜色,而是会在切换时呈现动画效果。
△ Flutter 使 Flokk 得以实现流畅的动画、高性能滚动和轻松的主题切换
Flokk Contacts 应用背后的创意团队由 Grant Skinner 领导,他以出色设计和创新用户体验而闻名。对于 Linux 上的 Flutter,Grant 这样说:
构建 Flokk Contacts 应用实在太轻松了!我们能够把过去的 Flutter 专业知识全部运用到 Linux 上,几乎不需要任何调整,而且这个应用运行得非常好。与 Canonical 团队的合作也相当美妙: 他们热情又投入,全力让 Flutter 在 Linux 和所有其他平台上都能变得更好。这是一个了不起的项目,我很荣幸能够利用 Flutter 进驻另一个主要操作系统。
— Grant Skinner


如果您想在 Linux 机器上使用 Flokk 应用,可以从 GitHub 下载最新版本。或者,如果您正在使用 snapd,可以从 Snap Store 下载 Flokk 应用。


  • 在 GitHub 上获取 Flokk

    https://github.com/gskinnerTeam/Flokk/releases

  • 在 Snap Store 上获取 Flokk

    https://snapcraft.io/flokk-contacts



在 Linux 上轻松安装 Flutter


了解到 Flutter 应用在桌面 (尤其是在 Linux 中) 运行时的优异表现后,您想必希望在自己的 Linux 机器上实际体验它。为使过程尽可能简单,我们特别在 Snap Store 中提供了 Linux 版 Flutter SDK 的 snap (Snap Store 中分发的包被称为 snap)。Flutter SDK snap 提供了在热门 Linux 发行版上开发 Flutter 应用所需的一切。只需安装 Flutter SDK snap 和您最喜爱的 IDE,无需安装大量开发依赖项,就可以立即开始创建、编译并发布您的 Linux 应用。

例如,如果您想为 Linux 开发 Flutter 应用,并且选择的 IDE 是 Visual Studio Code,那么在 Linux 终端上,您只需使用以下命令:
$ snap install --classic flutter$ snap install --classic code$ code --install-extension dart-code.flutter

如果您还想使用 Linux 开发移动应用,只需安装 Android SDK 或 Android Studio (里面包含 Android SDK)。有关 Flutter SDK snap 的更多信息,请访问下方链接。 


  • 安装 Android Studio

    https://developer.android.google.cn/studio/install#linux

  • Flutter SDK snap

    https://snapcraft.io/flutter



适用于 Linux 桌面的 Flutter


在 Linux 机器上安装 Flutter SDK 后,要构建桌面应用,您需要升级为 Flutter dev 或 master 渠道。然后启用 Linux 桌面支持:
$ flutter channel dev$ flutter upgrade$ flutter config --enable-linux-desktop

现在,在创建新的 Flutter 项目时,您将获得一个 linux 子目录,这个子目录让您可以在 Linux 桌面上运行应用:
$ flutter create counter$ cd counter$ flutter run -d linux

△ 大家熟悉的 Flutter Counter 应用也可以在 Linux 上流畅运行
您将得到一个使用 Flutter 构建、运行在最新稳定版 GTK+ 上的崭新 Linux 应用。如果您已经有一个 Flutter 项目,想为其添加 Linux 支持,那么可以按以下方式添加 linux 子目录:
$ cd my_flutter_app$ flutter create .

这将创建带有 Runner 项目的 linux 子目录,您需要通过这个项目在 Linux 桌面上构建和运行您的 Flutter 应用。


Flutter 调用 Linux 原生代码


除了通过编写 Dart 代码创建 Flutter widget 来支持桌面之外,您的 Linux 桌面应用还可以使用平台通道C/C++ 的 Dart 外部函数接口访问原生 Linux 的全部功能。或者,如果您想重复使用现有代码,可以在 pub.dev 上找到所需代码,pub.dev 是 Dart 和 Flutter 的 package 管理平台。pub.dev 上大部分的 package 完全使用 Dart 编写,其中大多数都可以在 Linux 应用中正常运行。有些 package (被称作插件) 里包含特定于一个或多个平台的原生代码。作为今天发布的 Flutter Linux 版本的一部分,我们在 pub.dev 上发布了三个使用 Linux 原生功能的插件:

  • url_launcher: 使用提供的网址启动默认浏览器

    https://pub.flutter-io.cn/packages/url_launcher

  • shared_preferences: 在应用会话之间共享的用户偏好设置

    https://pub.flutter-io.cn/packages/shared_preferences

  • path_provider: 专用目录 (例如下载、图片等) 的路径信息

    https://pub.flutter-io.cn/packages/path_provider


  • 平台通道

    https://flutter.cn/docs/development/platform-integration/platform-channels

  • Dart 外部函数接口

    https://dart.cn/guides/libraries/c-interop

  • pub.dev (Linux)

    http://pub.flutter-io.cn/flutter/packages?platform=linux


您可以在应用中使用这些插件,还可以通过它们了解如何通过 Flutter 代码访问原生 Linux,比如 url_launcher 的 Linux 实现


  • url_launcher 的 Linux 实现

    https://github.com/flutter/plugins/tree/master/packages/url_launcher/url_launcher_linux/



部署到 Snap Store


要将 Flutter 应用部署到 Snap Store,首先需要安装 Snapcraft。您将使用这一工具将应用构建和发布为 snap:
$ sudo snap install snapcraft --classic

要使用 Snapcraft 工具,您需要在应用的项目目录中创建一个 snapcraft.yaml 文件。例如,这是 Flokk 的 snapcraft.yaml 文件:
name: flokk-contactsversion: 1.0.1summary: Flokk Contactsdescription: A fresh and modern Google Contacts manager that integrates with GitHub and Twitter.confinement: strictbase: core18grade: stableapps: flokk-contacts: command: flokk-contacts extensions: [flutter-master] plugs: - networkparts:  flokk-contacts:   source: .   plugin: flutter   flutter-target: lib/main.dart # app's main entry-point file

现在,在包含 snapcraft.yaml 文件的目录中,您可以运行 snapcraft 构建应用的 snap。
$ snapcraft

一切顺利的话,这将在您当前的工作目录中生成一个文件,例如 flokk-contacts_1.0.1_amd64.snap

设置好用于在 Snap Store 中发布 snap 的帐号后,即可发布:
$ snapcraft login$ snapcraft register flokk-contacts$ snapcraft upload flokk-contacts_1.0.1_amd64.snap --release edge

  • 设置账号
    https://snapcraft.io/docs/creating-your-developer-account

此命令会将应用上传到 Snap Store,并尝试将其发布至 edge 渠道。在应用发布到 edge 渠道后,即可通过 Snap Store 桌面客户端或以下命令行进行安装:
$ snap install --edge flokk-contacts


  • edge 渠道
    https://snapcraft.io/docs/channels#heading--risk-levels

有关从头构建 snap 并将其发布到 Snap Store 的更多详细信息,请参阅指导教程

  • 指导教程: 发布首个 snap
    https://snapcraft.io/first-snap#flutter


Flutter Linux 桌面示例


Flokk 应用是一个绝佳的 Flutter 实际应用示例。如需更简单的示例,您可以选择 Photo Search 应用,此应用也是专为展示桌面功能而构建的。

△ 在 Linux 上体验 Photo Search 示例应用

  • Photo Search
    https://github.com/flutter/samples/tree/master/experimental/desktop_photo_search


Photo Search 是一款简单的在线照片搜索应用,使用多个插件访问原生平台功能,同时支持 macOS 和 Linux。

如需带有逐步说明的示例 Linux 桌面应用,推荐您参考 "编写 Flutter 桌面应用" 这个 codelab,它将指导您使用 OAuth 和 GraphQL 在 Flutter 中构建 GitHub 客户端。
△ Flutter GitHub codelab 客户端应用实际效果
  • "编写 Flutter 桌面应用" codelab
    https://codelabs.flutter-io.cn/codelabs/flutter-github-graphql-client/


如果您想深入了解 Flutter 的功能,并体验更多小型程序,我推荐一个更全面的应用: Flutter Gallery,这款应用去年进行了重新设计,以支持桌面和移动设备。如果您想看看它的实际效果,也可以从 Snap Store 下载

△ Flutter Gallery 示例可通过 Snap Store 获取

  • Flutter Gallery

    https://github.com/flutter/gallery

  • 从 Snap Store 上下载

    https://snapcraft.io/flutter-gallery


Thorsten Lorenz 制作的多人游戏 batufo 则展现出 Flutter 有趣的一面。在这款游戏中,世界各地的玩家在漂亮的场景上展开实时对战。

△ 跨多个 Flutter 平台进行实时游戏

  • batufo

    https://thlorenz.com/batufo/


Thorsten 持续打造这款游戏以支持多个 Flutter 平台,包括 Linux、macOS、Android 和 iOS。如果您想了解他的工作历程以及后续更新,可以观看他的开发视频,并在 GitHub 上查看他提供的代码。您可以 Snap Store 下载并在 Linux 中安装这个游戏。

  • 开发视频
    https://thlorenz.com/batufo/#watch
  • GitHub: batufo
    https://github.com/thlorenz/batufo
  • Snap Store: batufo
    https://snapcraft.io/batufo


总结


通过 Flutter Linux 的 alpha 版本,以及 Google 与 Canonical 之间的紧密合作,Linux 开发者得以使用 Flutter。欢迎大家通过 snap 安装 Flutter SDK,使用 Visual Studio Code 或 Android Studio 在 Linux 上构建和测试您的桌面应用,并将您的应用部署到 Snap Store。如需了解最新详情,请参阅 Flutter 桌面支持。我们期待您提供反馈,以持续帮助 Flutter 在 Linux 以及所有其他支持平台上变得更好。


  • 在 Linux 上安装 Flutter

    https://snapcraft.io/flutter

  • Flutter 桌面支持

    http://flutter.cn/desktop

  • 提交反馈

    https://github.com/flutter/flutter/issues


我们的梦想是让 Flutter 成为面向所有平台的最佳应用构建方案,借助 Canonical 团队的 Flutter for Linux,我们的梦想向现实迈进了一大步。通过对桌面平台提供支持,使 Flutter 引擎在 Google 无法直接支持的长尾设备上的适应性更强,我们计划不断建立合作关系并持续支持生态系统的成长。

在设备需要运行流畅且精美的应用时,就到了 Flutter 大显身手的时候了。

鸣谢: Kathy Walrath



推荐阅读






 点击屏末 | 阅读原文 | 访问 Flutter 开发者社区中文资源



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存