反对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】: