我们的发布重点优先关注在性能、开发者体验以及 Web 集成上

2021 年 3 月 Flutter Web 支持已进入稳定版,那么,下一步是什么?

在我们对用户调研的研究中发现,有超过 10%的 Flutter 项目目标是发布到 Web 平台。因此,目前我们会专注于提升第一个 Web 稳定版的质量,并使更多开发者能够将 Flutter Web 应用投入到生产环境。

根据 Flutter 每个季度的调查结果和我们通过 Issue、开发者面谈、社交媒体渠道中听取到的信息,我们确立了这些优先事项。我们刚刚收到了第三季度的调查结果,大家的反馈与我们的计划不谋而合。

本文提供了详细的路线图和每个优先事项对应的工作计划。有些特性可能会跨越几个季度的时间来完成,使用放大镜符号 🔍 标识的特性代表它们仍需进一步调查之后才能给出一个解决方案。

让 Flutter 应用在 Web 上表现得自然是一件很重要的事,这包括诸如滚动行为、文本功能、闪屏、超链接、搜索引擎优化和其他 Web 应用特有的功能。

RTL 文本

#

此前,Flutter 没有在 Web 上对从右到左 (RTL) 的语言 (如阿拉伯语和希伯来语) 提供完整的支持。虽然框架本身支持 RTL 文本,但 Web 引擎忽略了 LTR 和 RTL 之间的区别,从而产生了未定义的行为。

近期发布的 Flutter 2.5 稳定版 增加了对 RTL 的基础支持,Flutter Web 应用已经支持了 RTL 语言的所有主要场景。大部分与基础支持相关的问题已经得到了解决,并且我们正在计划修复剩余的问题。

滚动行为

#

虽然 Flutter 2 对滚动做出了 一些改进,来支持桌面浏览器上的滚动行为 (如滚动条支持),但在浏览器或运行 Web 应用的操作系统上,滚动行为依然在某些情况下没有达到预期。

虽然其中一些行为依赖于 Flutter 的桌面端支持,但我们计划在这个路线图中,解决一些物理滚动属性和滚动条的问题,问题如下所示。我们还计划展开对触控板支持的研究。

🔍 研究对 触控板的支持

应用加载 API

#

有些 Web 应用倾向于在加载或进行一些自定义体验的时候,通过闪屏页、加载指示器或落地页来实现这个体验。目前在 Flutter Web 应用内并没有显示正在加载或实现自定义体验的简单方法,并且当用于渲染的 CanvasKit 体积较大时,这将会变成比较棘手的问题。

我们正专注于为应用启动周期提供一个显式 API,可以用来预装应用,控制应用的加载周期,并创建闪屏页或加载指示器。

无障碍是我们的首要任务之一;我们旨在为你提供必需的工具以构建可访问的 Web 应用,且应用在最常见的屏幕阅读器上运行良好。

Flutter 2.2 对无障碍支持进行了极大的改进。从那时开始,我们就听到了一些终端用户的担忧,他们试图用屏幕阅读器 (如 JAWS) 来浏览他们的 Web 应用。

在该路线图中,我们将专注于桌面浏览器 支持的屏幕阅读器 的问题,同时,我们还将继续研究如何提高我们整体无障碍支持。

我们将始终优先考虑性能,以改善 Flutter Web 应用的用户体验。目前我们的主要目标是改善滚动卡顿,并加快 Web 应用的初始加载速度。

滚动时的卡顿

#

我们近期的季度调查数据显示,滚动卡顿是首要的性能问题报告之一。我们的目标是无论在手机上使用手势,还是在桌面上使用鼠标 / 键盘,都确保 Flutter Web 应用能流畅滚动,但这也取决于 Web 应用期望用户滚动内容的类型和数量。

在未来几个月里,我们将专注于改善由于图像解码造成的卡顿,也同时将继续研究滚动的性能问题,以找到我们可以改善的其他用例。

捆绑 CanvasKit (离线支持)

#

目前,用 CanvasKit 渲染的 Flutter Web 应用需要额外的手动步骤,才能作为渐进式 Web 应用 (PWA) 离线工作。为了在离线模式下完全作为 PWA 工作,并确保应用符合严格的内容安全策略,我们需要捆绑 CanvasKit 和备选字体。

我们将首先捆绑 CanvasKit,然后捆绑字体,并添加必要的工具以启用离线模式。

CanvasKit 的下载大小

#

CanvasKit 的性能优于基于 DOM 的方法,因此它是我们在桌面浏览器上的默认渲染器。然而,下载应用所需的时间会影响初始加载性能 (以及在 Web 上运行的 Flutter 应用的 Lighthouse 得分)。

在该路线图中,我们将研究如何减少 CanvasKit 的下载大小,以努力提高初始加载性能。我们希望确保终端用户的设备或浏览器不会处理大量的有效载荷。

提升浏览器代码集成的能力,有利于 Web 平台优势的发挥。Flutter Web 应用有两种方式与 HTML 集成。1) 在 Flutter Web 应用中使用 HTML 平台视图,或 2) 将 Flutter 作为内容集嵌入现有的 Web 应用 (类似于 Web 的附加应用)。目前前者已经可用且需要改进,而后者将是一个新功能,需要进一步设计和开发。

用自定义元素嵌入 (add2app)

#

今天,将 Flutter Web 应用嵌入现有网站 / Web 应用的唯一方法是通过 iframe。虽然这在某些场景下是可行的,但对于那些慢慢将其 Web 应用迁移到 Flutter 的开发者来说,这并不是一个理想解决方案。

在该路线图中,我们将研究并设计一款定制的解决方案,使你能够嵌入 Flutter Web 应用,类似于在移动端 add2app 的场景。

🔍 渲染自定义元素内的应用

Flutter 的生态系统包括了用于开发的功能,但目前仍然缺乏 Web 的功能支持,如插件、调试、热重载等。为了让你在 Web 端有一个良好的开发者体验,我们将继续缩减移动端和 Web 端之间的差距。

相机插件

#

自最初的 Web 稳定版本发布以来,相机插件一直是呼声最高的插件之一;许多人发现,在将 Flutter 移动应用引入 Web 时,同步差距是一个主要的问题。

Flutter 2.5 稳定版 ,我们提供了这个插件的早期版本,可以初始化相机,显示相机预览,并拍摄照片。我们收到反馈后将会对这个插件进行改进。

以上是对目前我们在 Web 上路线图的概述,GitHub 问题列表 依然是我们正在处理的问题来源。我们可能会根据了解到的情况和开发者们的反馈来增加、延长或推迟功能。

我们非常重视开发者们的反馈,并感谢大家一如既往的支持。

感谢 flutter.cn 社区成员 (@AlexV525、@Vadaski、@MeandNi) 以及 Lynn 对本文的审校和贡献。