关于flutter:Flutter-122-正式发布

5次阅读

共计 11297 个字符,预计需要花费 29 分钟才能阅读完成。

反对 iOS 14 和 Android 11,新的 i18n 和 l10n 反对,可用于生产的 Google Maps 和 WebView 插件,新的 App Size 工具等等!

作者:Chris Sells

原文:https://medium.com/flutter/an…

咱们很快乐推出最新版本的 Flutter,它广泛支持 iOS 14 和 Android11。Flutter 1.22 在以前版本的根底上构建,使开发人员可能从一个代码库为多个平台构建疾速,好看的用户体验。咱们的季度稳固版本蕴含最新性能,性能改良和谬误修复,适宜宽泛的生产应用。

因为这是新的挪动操作系统版本的公布节令,因而此发行版侧重于确保 Android 11 和 iOS 14 与 Flutter 兼容。这两个操作系统的更新都包含大量的幕后工作,以合乎最新的 SDK 并确保所有内容都通过咱们宽泛的测试套件。对于 iOS 14,此版本包含对新 Xcode 12,新图标的反对以及对新 iOS 14 App Clips 性能的预览反对。对于 Android 11,此更新反对新类型的显示切口以及在调出软键盘时更晦涩的动画。

该版本公布于咱们的 1.20 公布两个月之后,因而比大多数版本都短。即便在这么短的工夫内,咱们也敞开了 3,024 期,合并了 197 个贡献者的 1,944 个 PR。在这些贡献者中,有 114 位(58%)来自整个社区,他们奉献了 271 个 PR。最大的繁多贡献者是 a14n,他再次以 20 个 PR 成为咱们的卓越贡献者名单,其中大多数是作为反对 Flutter 中的零安全性工作的一部分而实现的(更多内容行将推出)。

除了对新的挪动操作系统版本的反对外,还有很多其余要分享的新闻,包含预览 Android 最重要的性能之一:状态复原,新的“Material 格调按钮“,新的国际化和本地化反对(与热重载一起应用),一个新的 Navigator,一个稳固的 Platform Views 版本(Google Maps 和 WebView 插件的根底)以及一个开关,您能够在其中增加代码以改善在具备高频率显示的设施上的滚动。咱们还提供了一个用于分析应用程序大小并确保您要构建的插件仅反对您要反对的平台的新工具。

iOS 14

每当公布新版本的挪动操作系统时,咱们都会对其进行彻底测试,以查找影响 Flutter 及其工具的不兼容性或更改。

对于 iOS 14,咱们对 Flutter 进行了很多更改,以确保它能够依照开发人员的形式工作:

  • Xcode 12 须要 iOS 9.0 或更高版本,因而咱们的默认模板将其默认值从 8.0 减少到 9.0
  • iOS 14 特定解体和字体渲染问题已在 Flutter 1.22 中修复
  • Flutter 1.20.4,修复了部署到真机设备的问题
  • 当应用程序拜访其剪贴板时显示应用告诉,导致在 Flutter 应用程序中呈现虚伪告诉,该问题已在 Flutter 1.20.4 中修复
  • iOS 14 设施上会禁止运行 debug 应用程序,但理论开发 debug 除外
  • 针对本地调试的 Flutter 应用程序的无关网络安全的新策略使 iOS 14 显示一次性确认对话框(仅在开发过程中,不适用于已公布的 Flutter 应用程序)

如果您要通过 Flutter 利用定位 iOS 14,咱们强烈建议您应用 Flutter 1.22 对其进行重建,而后立刻将其部署到 App Store 中,以确保您的 iOS 14 用户获得最佳体验。

无关应用 Flutter 适配 iOS 14 的更多详细信息,包含增加 Flutter 利用到原生利用,deep linking 和告诉注意事项,请参阅 flutter.dev 上的 iOS 14 文档。

心愿所有无关工具和 SDK 反对的工作都能够让您专一于本人关怀的编码 - 利用 iOS 14 的新性能。

其中一项性能是对 iOS 的新 SF Symbols 字体的更新反对,咱们花一些工夫更新了 cupertino_icon 程序包。将 cupertino_icons 依赖关系更新为新的 1.0 次要版本后,CupertinoIcons 的现有用法将主动映射到新款式。如果您将 cupertino_icons 1.0 与 Flutter 1.22 联合应用,那么您还能够通过 CupertinoIcons API 拜访约 900 个新图标。

您能够在 cupertino_icons 预览页面上看到图标的残缺列表,在 flutter.dev 上能够看到迁徙详细信息页面。

您能够在 iOS 14 上尝试应用 Flutter 的另一个性能是 App Clips,它是 iOS 14 的一项新性能,它反对 10MB 以下轻量级应用程序的疾速,无装置应用程序执行。在 Flutter 1.22 版中,咱们预览了应用 Flutter 构建的 App Clip 指标。

无关如何应用 Flutter 构建 Clip 的更多详细信息,请查看 flutter.dev 上的文档。您也能够参考这个简略的示例我的项目。

Android 11

Flutter 的这个版本也与本月 Android 11 的公布相吻合。Flutter 框架和引擎已更新,以反对最新版本的 Android 中引入的两个新性能。

首先,Flutter 当初反对多种屏幕适配(比方瀑布屏)。

通过应用 MediaQuery 和 SafeArea API,您能够确保将流动的 UI 和交互式元素搁置在设施显示屏的无障碍区域中。另外,您将要防止在瀑布边缘区域应用手势检测器,因为这可能会导致意外触摸。

其次,动画在显示软件键盘时与 Android 11 同步。

问题 #19279 是一个长期存在的问题,其中零碎键盘的显示 / 暗藏动画与 Flutter 的插图不同步。这在 Android 11 中已修复。

对于 Android 嵌入 API 的一项阐明。去年,随着 Flutter 1.12 版的推出,咱们推出了一套实用于 Android 的新 Flutter 引擎和 Flutter 插件 API。咱们创立了这些 v2 API,以更好地反对 Android 上的应用程序增加用户。一年后,超过 80%的 Android 插件应用了新的 Android API。从 1.22 开始,咱们不再应用较旧的 v1 API。

如果您仍在应用 Android v1 API,那么这对您意味着:

  • 新创建的插件将不再针对 v1 API
  • Flutter 工具的 -no-enable-android-embedding-v2 配置标记已删除,当初是默认行为
  • 仍在应用 v1 API 的旧版应用程序在构建过程中将显示弃用正告,该正告指向反对新的 Android 插件 API 文档

同时,如果您依然有基于 v1 Android API 的 Flutter 应用程序,它将持续运行。然而,您可能会开始遇到仅针对 v2 API 且 v1 Android API 无奈应用的新插件。无关更多详细信息,请参见重大更改文档。

扩大的 Button 组件

现有的 Flutter 按钮看上去不错,但很难应用,尤其是在须要自定义主题时。此外,“Material”标准已扩大为包含具备新款式的新按钮。

为使 Flutter 放弃与 Material 指南的最新程度,咱们很快乐地发表 Flutter 1.22 中的引入全新的按钮。

该 PR 并没有尝试就地开发现有的按钮类及其主题,而是引入了新的替换按钮小部件和主题。除了使咱们解脱现有类的向后兼容性迷宫之外,新名称还使 Flutter 与 Material Design 标准同步,后者应用按钮组件的新名称。

新主题遵循 Flutter 最近在新 Material 窗口小部件中采纳的“规范化”模式。如果您想玩演示,DartPad 上有一个很棒的演示。这并不是一个重大变动,因为 FlatButton,OutlineButton,RaisedButton,ButtonBar,ButtonBarTheme 和 ButtonTheme 的语义不会扭转。您能够将旧按钮与新按钮混合应用。

新的国际化和本地化反对

自 Flutter 创建以来,Flutter 已提供您的应用程序国际化(i18n)和本地化(l10n)所需的外围性能。然而,在此版本中,咱们将最佳做法的意见纳入了咱们的工具中,甚至在增加新的 l10n 信息时启用了热重装反对来更新您的利用。

如果您想理解无关 Flutter 对 l10n 的反对的更多详细信息,包含本地化音讯,带有参数的音讯,日期,数字和货币,请浏览 Flutter Internationalization 用户指南。

此外,如果您对 i18n 和 l10n 感兴趣,那么您可能还对那些字符串不适宜一般 ASCII 字符的字符串感兴趣,例如 Unicode 和 emoji。最近,Dart 团队公布了 character 软件包,该软件包可帮忙开发人员解决 Unicode(扩大)字形簇。该软件包有助于解决诸如如何正确地将字符串(如“A in text in English”)缩写为前 15 个字符的问题。应用 String 类,该缩写为“A????????text in”,它仅是 12 个用户可感知的字符。另一方面,应用字符包会产生“A????????text in Eng”的正确缩写。

通过此 PR,Flutter 应用字符包来正确处理这些简单字符。例如,当应用具备 maxLength 限度的 TextField 时,像????‍????‍???? 这样的字符当初能够正确地计为单个字符。同样,有了此 PR,在 Flutter 所在的我的项目中,字符包均可主动在我的项目中应用,而无需手动增加。心愿这使得解决来自所有语言环境的各种字符串变得更加容易。无关 character 包的更多详细信息,请查看杰出的文章,正确实现 Dart 字符串操作。

Google Maps 和 WebView 插件筹备投入生产

在 Flutter 小组的这里,咱们通常会审慎地将某些标签标记为“生产就绪”,直到咱们对本人进行彻底测试为止。对于 google_maps_flutter 和 webview_flutter 插件,选通因素始终是底层的 Platform Views 实现,该实现容许将 Android 和 iOS 的本机 UI 组件托管在 Flutter 应用程序中。在此版本的 Flutter 中,咱们很快乐地发表,咱们对框架进行了强化,足以将这两个插件申明为能够投入生产。

在 Flutter 1.22 中,咱们增加了代替的 Platform Views 实现,该实现修复了所有已知的键盘以及 Android 视图的可拜访性问题。此外,它还实用于 19 级及以上的 Android API(以前要求 20 级)。咱们还在 iOS 上进行了线程改良,使平台视图更高效,更牢靠(并且不再须要您将 io.flutter.embedded_views_preview 标记增加到 iOS Info.plist)。

webview_flutter 插件反对新的 Android 平台视图模式,但以后须要手动启用。一旦在更宽泛的社区中失去更多应用,咱们将默认在未来的版本中启用它。

Google Maps 和 WebView 插件曾经从 Platform Views 的改良中受害。如果您想应用平台视图在 iOS 或 Android 上托管本人的本机 UI 组件,则能够理解如何在应用平台视图在 Flutter 利用中托管本机 Android 和 iOS 视图上。

Navigator 2.0

如果您以前在 Flutter 应用程序中应用过导航性能,则可能曾经留神到外围数据结构(用户正在浏览的页面堆栈)对您而言是暗藏的。而是要对其进行治理,请调用 Navigator.pop()或 Navigator.push()。举例来说,假如您想在首页上显示一系列小部件,并容许用户点击一个小部件以转到专门针对该色彩的详细信息页面。

实现如下:

class ColorListScreen extends StatelessWidget {
 final List<Color> colors;
 final void Function(Color color) onTapped;
 ColorListScreen({this.colors, this.onTapped});
 
 @override
 Widget build(BuildContext context) => Scaffold(appBar: AppBar(title: Text('Colors')),
       body: Column(
         children: [
           // you can see and decide on every color in this list
           for (final color in colors)
             Expanded(
               child: GestureDetector(child: Container(color: color),
                 onTap: () => onTapped(color),
               ),
             )
         ],
       ),
     );
}
 
class ColorScreen extends StatelessWidget {
 final Color color;
 const ColorScreen({this.color});
 
 @override
 Widget build(BuildContext context) => Scaffold(appBar: AppBar(title: Text('Color')),
       body: Container(color: color),
     );
}

应用最简略的 Navigator 1.0 款式,您能够以看起来非常简单的形式在这两个屏幕之间导航:

class _ColorAppState extends State<ColorApp> {List<Color> _colors = [Colors.red, Colors.green, Colors.blue];
 
 @override
 Widget build(BuildContext context) => MaterialApp(
       title: 'Color App',
       home: Builder(builder: (context) => ColorListScreen(
           colors: _colors,
           // the Navigator manages the list of pages itself; you can only push and pop
           onTapped: (color) => Navigator.push(
             context,
             MaterialPageRoute(builder: (context) => ColorScreen(color: color)),
           ),
         ),
       ),
     );
}

只需对 Navigator.push()进行调用,即可将第一个页面推到第一个页面的顶部,从而创立两页的堆栈。然而,与在 ColorListScreen 的 build 办法中创立的 Container 列表不同,该堆栈对您暗藏。而且,因为它是暗藏的,因而很难针对其余状况进行治理,例如解决由本机嵌入提供的初始路由的深层链接,或者来自 Web 的 URL 或来自 Android 的用意。治理同一页面的不同排列之间的嵌套路由也极其艰难。

Navigator 2.0 通过使页面堆栈可见而解决了这些问题,甚至更多。这是在雷同的 ColorListScreen 和 ColorScreen 之间导航的更新示例:

class _ColorAppState extends State<ColorApp> {
 Color _selectedColor;
 List<Color> _colors = [Colors.red, Colors.green, Colors.blue];
 
 @override
 Widget build(BuildContext context) => MaterialApp(
       title: 'Color App',
       home: Navigator(
           // you can see and decide on every page in this list
         pages: [
           MaterialPage(
             child: ColorListScreen(
               colors: _colors,
               onTapped: (color) => setState(() => _selectedColor = color),
             ),
           ),
           if (_selectedColor != null) MaterialPage(child: ColorScreen(color: _selectedColor)),
         ],
         onPopPage: (route, result) {if (!route.didPop(result)) return false;
           setState(() => _selectedColor = null);
           return true;
         },
       ),
     );
}

该应用程序显式创立一个导航器,并为其提供代表残缺堆栈的页面列表。咱们创立一个空的_selectedColor,以批示尚未抉择任何色彩,因而咱们最后不显示 ColorScreen。当用户抉择一种色彩时,咱们通常会调用 setState()来向 Flutter 示意您心愿再次调用 build()办法,该办法当初会创立一个堆栈,其顶部是 ColorScreen。

您能够在 OnPopPage 回调中更新状态,例如,如果用户弹出,则示意他们已“勾销抉择”以后色彩,因而咱们不再心愿显示该页面。

如果 Navigator 2.0 看起来像 Flutter 的其余部分,那就是用意 - 它是申明性的,而 Navigator 1.0 则是必须的。这个想法是要在导航和 Flutter 的其余部分之间对立模型,同时解决许多问题并增加性能。实际上,这个小例子简直不波及 Navigator 2.0 的内容。无关详细信息,我强烈推荐无关 Flutter 中的申明式导航和路由的文章。

另外,您对 Navigator 1.0 的现有应用将像明天一样持续应用,并且不会在短期内被删除。如果您喜爱该模型,则能够持续应用它。然而,如果您尝试应用 Navigator 2.0,咱们认为您会喜爱的。

预览:Android 的状态还原

在此版本中可供您试用的新性能是对 Android 状态复原的反对。这是咱们最受欢迎的性能之一,领有 217 个大拇指!

对于不相熟状态还原需要的用户,挪动操作系统可能会杀死后盾的应用程序,以回收前台应用程序的资源。产生这种状况时,操作系统会告诉该利用被终止以疾速保留任何 UI 状态,以便在用户循环回到该利用时能够将其复原。正确施行后,能够为用户提供无缝的体验,同时能够更好地利用设备的资源。到目前为止,Flutter 不反对状态还原,没有框架的反对,很难正确地进行状态还原。因而,咱们很快乐可能为 Android 提供此性能的根本实现。

这是一个用于复原默认 Flutter Counter 利用状态的非常简单的示例:

class CounterState extends State<RestorableCounter> with RestorationMixin {
  @override
  String get restorationId => widget.restorationId;

  RestorableInt _counter = RestorableInt(0);

  @override
  void restoreState(RestorationBucket oldBucket) => registerForRestoration(_counter, 'count');

  void _incrementCounter() => setState(() => _counter.value++);

  @override
  Widget build(BuildContext context) => Scaffold(body: Center(child: Text('${_counter.value}')),
      floatingActionButton: FloatingActionButton(onPressed: _incrementCounter),
    );
}

简要地说,每个小部件都有一个 storage bucket,该 storage bucket 应用惟一的 ID 向 RestorationMixin 注册。通过应用 RestorableProperty 类型(如此处应用的 RestorableInt)来存储特定于 UI 的数据,并通过 State Restoration 性能注册该数据,该数据将在 Android 杀死该利用之前主动存储,并在其恢复正常运行时复原。就是这样。所有以 Restoration * 类型存储的数据,例如 RestorableInt,RestoableString 和 RestorableTextEditingController(咱们都有很多)都将被还原。而且,如果咱们没有涵盖您要还原的所有类型,则能够通过扩大 RestorableProperty 创立本人的类型。

为了自动测试状态复原,咱们向 WidgetTester 增加了新的 restartAndRestore API。要进行手动测试,最简略的办法是在 Android 设施上启动启用了状态复原性能的 Flutter 利用,在 Android 开发人员设置中启用“不要保留流动”,运行 Flutter 利用,将其置于后盾,而后而后回到它。此时,Android 将终止并复原您的应用程序,因而您能够查看所有是否按预期工作。

只管咱们很快乐将状态复原的预览版放在您的手中,但还有更多工作要做。例如,状态复原不仅实用于 Android,iOS 应用程序也能够受害。此外,咱们正在忙于更新本人的窗口小部件,以在复原过程中放弃其状态。咱们曾经在 Scrollable 类中提供了反对,例如 ListView 和 SingleChildScrollView(记住用户的滚动地位)和 TextField(复原他们输出的文本),并且咱们打算将其扩大到其余小部件。

预览:平滑滚动以提供不匹配的输出和显示频率

当输出和显示频率不同时,Flutter 团队与 Google 外部合作伙伴单干,极大地提高了滚动性能。例如,Pixel 4 输出的运行频率为 120hz,而显示屏的运行频率为 90hz。滚动时,这种不匹配会导致性能降落。应用新的 resamplingEnabled 标记,您能够利用咱们在 Flutter 中实现的性能工作来解决此问题:

void main() {
  GestureBinding.instance.resamplingEnabled = true;
  run(MyApp());
}

依据所波及的频率差别,启用此标记能够使滚动时的抖动缩小多达 97%。当咱们确定这是最好的体验时,咱们打算在当前的版本中默认启用此标记。

新的对立的 Dart 开发人员工具

与平常一样,对 Flutter 的更新不仅意味着引擎和框架,还包含工具。Flutter 1.22 包含 Dart(2.10)的新版本,还有一个新的 dart CLI 工具,您可能也会发现它有用。

Dart 历史上有许多较小的开发人员工具(例如,用于格式化的 dartfmt 和用于代码剖析的 dartanalyzer)。Dart 2.10 中的新增性能是一个与 Flutter 工具十分类似的对立的 Dart 开发人员工具。

从明天的 Flutter 1.22 SDK 开始,您会发现 / bin 文件夹(您可能在 PATH 中蕴含该文件夹)同时蕴含 flutter 和 dart 命令。无关更多详细信息,请参见 Dart 2.10 博客文章。

应用程式大小剖析工具

作为 Flutter 1.22 的一部分公布的工具包含一个新的输入大小剖析实用程序。此工具可帮忙诊断 Flutter,您的利用大小细分是否会随着工夫变动。

您能够通过将 –analyze-size 标记传递给以下任何命令来应用该工具收集剖析所需的数据:

  • flutter build apk
  • flutter build appbundle
  • flutter build ios
  • flutter build linux
  • flutter build macos
  • flutter build windows

在构建 Flutter 输入工件时应用此标记将打印工件尺寸和组成的摘要。这包含本机代码,资产,甚至是已编译 Dart 代码的程序包级细分。

此摘要有助于疾速辨认应用程序的程序包大小用法中的热点。此外,收集到的数据还能够作为 JSON 文件应用,供 Dart DevTools 应用,它使您能够依照 flutter.dev 上的阐明进一步浏览应用程序的内容,查明大小问题并查看两个不同 JSON 文件之间的更改。加载 JSON 文件后,您将领有一个界面,该界面为您提供利用大小的树状图。

无关您能够应用“利用大小”工具执行的操作的更多详细信息,请浏览 flutter.dev 上的“应用利用大小工具”文档。

预览:DevTools 中更新的网络页面

此版本中的另一个 DevTools 预览性能是可能在“网络”选项卡中查看 HTTP 和 HTTPs 响应主体。

要启用此性能,请通过 flutter 通道 dev 和 flutter 通道降级确保您位于 Flutter dev 通道上。

此外,对于具备大量网络流量的利用,咱们提供了搜寻和过滤性能。

无关“网络”选项卡的文档,请参阅在 flutter.dev 上应用网络视图。

IntelliJ 中的托管 DevTools 查看器选项卡

一段时间以来,咱们始终在保护某些 Flutter 工具的两个正本,例如 IntelliJ 中的 Inspector 窗格和 Dart DevTools 中的 Inspector 选项卡。这不仅会减慢咱们的速度,因为咱们必须保护两个代码库,而且某些性能尚未纳入 IntelliJ 插件中,例如布局资源管理器。因而,为了解决这两个问题,咱们启用了间接从 IntelliJ 外部的 Dart DevTools 托管“查看器”选项卡的性能。

留神增加了 Layout Explorer,您能够在代码旁边应用它。要启用此选项,请转至 Preferences > Languages & Frameworks > Flutter > Enable embedded DevTools inspector

改良了 Visual Studio Code 中的输入链接

Flutter 开发人员所面临的惯例流动是从终端或堆栈跟踪中的谬误输入中进行。在实用于 Visual Studio Code 的 Flutter 扩大的最新版本中,当初能够正确解析这些链接,以使您能够间接从输入中启用链接。

看来这是一件小事,然而对于此性能的初步反馈曾经十分踊跃。

与平常一样,此处的工具更改列表太多,然而我倡议以下布告以理解详细信息:

  • Dart DevTools — 0.9.0
  • Dart DevTools — 0.9.1
  • Dart DevTools — 0.9.3
  • Flutter IntelliJ Plugin M48.1 Release
  • Flutter IntelliJ Plugin M49 Release
  • Flutter IntelliJ Plugin M50 Release
  • VS Code extensions v3.14.0
  • VS Code extensions v3.15.0

客户关注点:EasyA

EasyA 是一款订阅应用程序,旨在使适龄学生通过即时消息与杰出的导师分割,并应用 Flutter 编写。最近,它被 Apple 举荐为“每日应用程序”。

“当学校在今年初开始上网时,咱们晓得咱们须要疾速启动辅导应用程序来帮忙学生。Flutter 的惊人倒退速度意味着咱们可能为 iOS 和 Android 施行屡获殊荣的设计,并且还能够公布到 Web 上—及时锁定!通常,这实际上是不可能的。然而,因为 Flutter 容许咱们同时针对所有三个平台,因而咱们可能高效地共享代码,并充分利用咱们的小型开发人员团队。”

EasyA 联结创始人 Phil Kwok

重大变动

与平常一样,咱们试图将重大更改的数量放弃在起码。以下是 Flutter 1.22 版本中的列表。

  • 56413 Prevent viewport.showOnScreen from scrolling the viewport if the specified Rect is already visible.
  • 62395 [gen_l10n] Synthetic package generation by default
  • 62588 Build routes even less.

概要

Flutter 1.22 稳定版可能在上一版本之后很快问世,然而其中蕴含很多好货色,因而本篇文章无奈一一列举。咱们心愿此版本能够帮忙您为 iOS 和 Android 开发杰出的应用程序,咱们急不可待想看到您的商店中有什么!感谢您的反对 - 咱们为您打造 Flutter。

交换

老孟 Flutter 博客(330 个控件用法 + 实战入门系列文章):http://laomengit.com

欢送退出 Flutter 交换群(微信:laomengit)、关注公众号【老孟 Flutter】:

正文完
 0