观摩!Flutter 1

如果你的 Flutter 应用程序需要运行在 iOS 14 系统上,我们强烈建议你将 Flutter 版本更新到 1.22 并立即部署到 App Store 中,这样可以确保你的 iOS 14 用户获得最佳体验。

有关 Flutter 如何适配 iOS 14 的更多信息,包括如何添加到原生应用、deep linking 等问题,可以参阅官网 iOS 14文档

我们的目标一直是希望开发者们能完全脱离所有工具和 SDK 的更新而者专注于应用本身的业务逻辑,这就要求我们需要充分支持 iOS 14 的各种新的特性。

本次,我们就针对 iOS 新发布的 SF Symbols 字体做了更新支持,对 cupertino_icon 库做了一系列的更新,现在只需要将 cupertino_icon 更新到最新的 1.0 版本,就能自动将 CupertinoIcons 映射成新样式的图标,Flutter 1.22 后,CupertinoIcons 也额外提供了 900 个新图标。

读者们可以在 cupertino_icons 预览页面上看到完整的图标列表,详情参见迁移详细信息页面

开发者可以在 iOS 14 上 尝试使用 Flutter 的另一个功能就是 App Clips(轻应用),这是 iOS 14 推出的一项新功能,它支持 10MB 以下轻量级应用程序的快速,免安装打开,而在 1.22 版后,我们就可以试一下 Flutter 在 iOS 上支持的 App Clip 功能了。

Flutter App Clip

Flutter App Clip

有关如何使用 Flutter 构建 App Clip 的更多详细信息,参见官方文档,也可以参考这个简单的示例项目

Android 11

Flutter 的此次更新也同样同步了本月发布的 Android 11。为了支持 Android 11 中引入的两个新功能,Flutter 框架层和引擎层都已做了相应的更新。首先,Flutter 现在已经支持多种全新 Android 屏幕的适配,如下图:

通过使用 MediaQuerySafeArea 这两个组件,开发者就可以确保将展示的 UI 和交互式组件放置在设备显示屏的无障碍区域中。另外,目前我们需要尽量避免在瀑布屏边缘区域使用手势检测器,因为这些手势检测器可能会导致意外触摸。

其次,显示软件键盘时的动画也已经与 Android 11 同步。

此前, Flutter 一直存在 #19279 这个问题,其中系统键盘的显示/隐藏动画与 Flutter 并不同步,这个问题也已经在此次更新中被修复。

关于 Android 嵌入 API 的注释。去年,Flutter 1.12 推出了一套全新的 Flutter 插件 API,我们开发了 v2 API 使开发者们能够更好的将 Flutter 嵌入到已有的原生应用中。据我们统计,到目前为止已经有超过 80% 的 Android 插件使用了新的 Android API 了,因此,从本次发布 1.22 开后,我们便不再维护旧的 v1 API。

如果你仍在使用 Android v1 API,可能会导致如下问题:

  • 无法使用新开发的插件
  • Flutter工具的 —no-enable-android-embedding-v2config 标志已被默认删除
  • 仍在使用 v1 API 的旧版应用程序在构建期间会显示弃用警告,并指向支持新的Android插件API文档

同时,如果你仍然有基于 v1 Android API 的 Flutter 应用程序,它虽然能够正常运行,但是很可能会使用遇到仅支持 v2 API 的新插件,而这些插件不能被 v1 Android API 使用。更多详细信息,请参见重大更改文档

全新的 Button 组件

之前的版本中,Flutter 已经有了一套完备的按钮组件,但使用起来却很麻烦,Material 规范也增加了多个新样式的按钮。所以,为了使 Flutter 保持与 Material 的同步,我们正式地宣布 Flutter 1.22 将引入全新的 “Button” 按钮。

新的 Button 组件的命名规范也与 Material Design 设计原则,如下。

DartPad 上有一个很好的示例。 另外,旧的组件如FlatButtonOutlineButtonRaisedButtonButtonBarButtonBarTheme也并不会被弃用,开发可以按照需求混合使用旧按钮与新按钮。

全新的国际化和本地化的支持

自 Flutter 发布以来,已经为应用提供了较好的国际化(i18n)和本地化(l10n)所需的核心功能的支持,而在此次的新版本中,我们也将该功能的最佳实践纳入了我们的开发工具中,并且,在添加新的 l10n 信息时启用了热重装支持来直接更新应用程序。

如果你想了解有关 Flutter l10n 的更多信息,包括本地化消息,带有参数,日期,数字和货币的消息,请参见Flutter Internationalization 用户指南

此外,如果你对 i18n 和 l10n 感兴趣,你可能还对那些字符串不包含在普通 ASCII 字符的字符串,例如 Unicode 和 emoji 的问题比较惯性。本次,Dart 团队也发布了 characters 软件包可以帮助开发人员处理 Unicode(扩展)字符簇。该库可以帮助开发者们解决诸如如何正确地将字符串(如“ A 🇬🇧 text in English”)缩写为前 15 个字符的问题,使用 String 类,该字符串可以缩写为 “ A 🇬🇧 text in”,它仅是 12 个用户可感知的字符。另一方面,使用 characters 也可以生成 “A 🇬🇧 text in Eng” 的正确缩写。

此PR 使用 characters 完美的处理了这些复杂的字符,例如,当 TextField 带有最大长度 maxLength 限制时,像 👨‍👩‍👦 这样的字符现在可以正确地算作单个字符,另外,此PR,在Flutter所在的项目中,字符包均可自动在项目中使用,而无需手动添加。希望这使得处理来自所有语言环境的各种字符串变得更加容易。有关 character 包的更多详细信息,请查看文章正确完成Dart字符串操作

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

Flutter 团队通常会经过仔细考虑后才会将某些标签标记为 “production ready”,在此之前,我们通常都会对其进行了全面测试。对于google_maps_flutterwebview_flutter 这两个插件底层都是使用 Platform Views 实现,从而允许将 Android 和 iOS 的原生 UI 组件嵌入在 Flutter 应用程序中。在此次的 Flutter 版本中,我们欣然宣布,我们已经对框架层进行了强化,完全能够将这两个插件都声明为可投入生产(即 “production ready”)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

webview_flutter 插件支持新的 Android Platform Views 模式,但当前需要手动启用。一旦在更广泛的社区中得到更多使用,我们将默认在将来的版本中启用它。

Google Maps 和 WebView 插件已经从 Platform Views 的改进中受益。如果你想使用平台视图在 iOS 或 Android 上嵌入自己的原生 UI 组件,可以参阅如何 Hosting native Android and iOS views in your Flutter app with Platform Views

Navigator 2.0

如果你之前在 Flutter 应用程序中使用过 Navigator,则可能已经注意到核心数据结构(用户正在浏览的页面路由堆)对你是不可见的。每次要进行管理时,需要调用 Navigator.pop()Navigator.push()。例如,假设你要在主页上显示一系列组件,并允许用户点击一个组件以进入该颜色的详细信息页面,如下图。

我们可以使用下面这种方式实现这两个简单的 UI 页面:

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 方法中显式地创建 Containers 列表不同,该路由栈并不可见,因此很难管理一些特殊情况,如处理由原生嵌入提供的初始路由的 deep linking,或者来自 Web 的 URL 或来自 Android 的 intent,管理同一页面的不同顺序之间的嵌套路由也极其困难。

Navigator 2.0 通过使页面堆栈可见解决了这些问题,甚至更多。下面这段代码是在 ColorListScreenColorScreen 之间的另一个版本 :

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; }, ), ); }

这里显式地创建了一个 Navigator,并为其提供代表完整堆栈的页面列表,我们创建一个空 _selectedColor 变量来表示尚未选择任何颜色,因此默认不显示 ColorScreen。当用户选择一种颜色时,我们调用 setState() 更新状态,Flutter 会重新调用 build() 方法,然后就会在 ColorScreen 顶部创建一个 ColorScreen 页面。

你可以在 OnPopPage 回调函数中更新返回的状态,例如,如果用户回退,则表示他们 “取消选择” 了当前颜色,从而 _selectedColor = null 表示不再希望显示该页面。

Navigator 2.0 看起来像 Flutter 的其余部分,那正是她的意图,它是声明性的,与 Navigator 1.0 势在必行,这个想法是要在导航和Flutter 的其余部分之间统一模型,同时解决许多问题并添加功能。实际上,这个小例子几乎还不涉及 Navigator 2.0 的内容。有关详细信息,推荐阅读 Declarative navigation and routing in Flutter

另外,Navigator 1.0 依然可以继续使用,短期内也不会失效,如果你已经喜欢这种路由模式,完全可以继续使用它。但是,如果你尝试使用 Navigator 2.0,我们认为你会喜欢的。

预览功能

重要知识点

下面是有几位Android行业大佬对应上方技术点整理的一些进阶资料。

高级进阶篇——高级UI,自定义View(部分展示)

UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!

  • 面试题部分合集

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

[外链图片转存中…(img-QvbY1JL9-1715391944848)]

  • 面试题部分合集
    [外链图片转存中…(img-nZCfctO4-1715391944848)]

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值