【Flutter】版本迭代这么快,Flutter 3.24 冲不冲?先踩为敬!Fultter 的版本更新一直都是比较快的
Flutter 升级3.24版本的过程
前言
Flutter 的版本更新一直都是比较快的,对于开发者来说并不是每次都是更新到最新的版本就万事大吉,我们一般都是锚定一个版本用一段时间,再观望其效果和对应的生态,最终决定是否升级。
我们开发者主要是看 Flutter 的渲染性能,插件的支持兼容程度,是否有严重的Bug和一些废弃的API和Widget的修改,是否新增了想要的控件等等因素。
现在,Flutter 3.24 以及 Dart 3.5 在稳定渠道的推出,我个人觉得比较不错。此次更新通过优化渲染引擎和内存管理使得的性能显著提升,应用运行更加流畅。并且修复了一些Bug,是我个人比较推荐升级的一个版本。
我个人比较推荐 3.16 3.19 3.24 这几个版本,我个人的电脑也是安装了这三个版本。目前从 3.19 升级到 3.24 的过程有哪些坑,修复了哪些问题,哪些需要注意的地方,在本文中我都会给大家指出,也是希望大家少踩坑了。
一、升级过程
如果想替换之前的版本那么直接运行 flutter upgrade 即可。如果想有多个 Flutter 版本,那么可以到官网下载对应的版本的 Flutter 到本地,配置对应的环境变量即可。【传送门】
我个人是使用的第二种方式,配置了多个 Flutter 版本。
配置完成之后可以查看环境变量以及输出命令
别忘记了配置 AS 中对应项目的 Flutter 版本,否则也不会有效果哦。
二、变动
- ModalRoute 的变动
最初由于涉及在 Web 端上按 Tab 键切换焦点的问题,改动到 ModalRoute 的类
最终导致的是移动端的跳转页面返回页面会造成页面的 rebuild,也就是说只要使用到 ModalRoute 类去做监听去拿路由参数等操作都会导致 rebuild.
可以看到我们的页面 onPause 和 onResume 是可以正常触发,但是每次 onPause 和 onResume 的时候就会重新 build 一次,听说 Flutter 3.24 版本修复了这个漏洞。
其实就是新添加了几个API,在 ModalRoute 获取内部常用属性的一些快速入口做了场景化封装。
例如我们想获取路由的设置拿到参数之类的,我们可以使用新方式
final arguments = ModalRoute.settingsOf(context)?.arguments;
但是如果我们还是想要通过 Router 的监听实现声明周期的监听,那你还是只能拿到 ModalRoute 这个对象
final route = ModalRoute.of(context);
if (route != null && route is PageRoute) {
routeObserver.subscribe(this, route); // 订阅至RouteObserver
}
WidgetsBinding.instance.addObserver(this); // 添加至WidgetsBinding观察者
那么毫无例外,你还是会有 rebuild 的困扰,那么我们只能回到原点,如果实在是想要这个方式确不想重复 build 页面,我们也只能修改源码这一种方式暂时解决这个问题把 Web 端的那个改动注释掉。
在 ModalRoute 类中修改如下代码:
或者我们抛弃这种方式使用 visibility_detector 的方式监听页面,具体可以参考我之前的文章。
- Material You 的变动
默认支持了 Material You 的风格,但是国内的开发环境,懂的都懂,完全用不到直接是负体验,甚至我们需要去除一些 Material You 的效果,比如入口的配置设置,Appbar的滚动变色处理等等。
- API 的报错
主要是一些API不再支持,删除了一些API,导致项目报错。
主要是 WidgetsBindingObserver 新增的几个回调,和 ThemeData 的字段调整。
// 3.24.0 新加的回调
@override
void didChangeViewFocus(ViewFocusEvent event) {}
@override
void handleCancelBackGesture() {}
@override
void handleCommitBackGesture() {}
@override
bool handleStartBackGesture(PredictiveBackEvent backEvent) {
return false;
}
@override
void handleUpdateBackGestureProgress(PredictiveBackEvent backEvent) {}
我们只需要默认实现和去除一些ThemeData即可。
- 无法运行的问题
不管你是否支持 window 平台,可能部分插件自带的 win32 依赖你也需要升级到最新版本,否则无法运行
# 5.5.0 报错,这里强制指定版本适配 Flutter 版本 3.24.0
win32: 5.5.4
Android的项目不支持 apply plugin 的方式,统一只能用 id 的方案了。
plugins {
id "com.android.application"
id "kotlin-android"
id "kotlin-kapt"
id "dev.flutter.flutter-gradle-plugin"
}
plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
id "com.android.application" version "7.1.2" apply false
id "org.jetbrains.kotlin.android" version "1.8.0" apply false
}
如果你还是使用的旧版本的依赖方式如:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
那么请你检查你的 android 包下面的 .gradle 文件需要替换依赖方式哦。
三、新特性
- 新 Sliver 组件:Flutter 3.24 引入了新的Sliver组件,允许开发者实现动态的应用栏行为,如浮动、固定或调整大小的头部设计,使得UI更加灵活和互动。
- SliverFloatingHeader
- PinnedHeaderSliver
- SliverResizingHeader
这个之前的文章我们讲到过,其实就是 Appbar 的各种行为的一个封装,可以脱离 Appbar 这个控件单独配合其他的控件使用。
- 新的控件 TreeView
这个其实也很好理解,它用于构建可以在所有方向滚动的高性能树形结构,关键是它支持各种方向的滚动,很好用。并且还出了 TreeSliver 配合在列表中使用。之前需要我们自定义实现的,现在官方给我们做好了。
- 新的控件 CarouselView 轮播
轮播控件我们一般都是使用第三方的插件,好用的轮播插件太多了,这里官方出的轮播比较简单,如果是简单的轮播需求不想导入第三方的插件可以试试。
- Impeller 性能优化
老生长谈的问题,一直在优化中。
- iOS 的 Swift Package 部分支持
支持初步的访问 Swift package 生态系统。Flutter 插件将能够利用不断增长的 Swift package 生态系统!简化 Flutter 安装。
Swift Package Manager 与 Xcode 捆绑在一起。将来,开发者无需安装 Ruby 和 CocoaPods 就可以在 Apple 平台上使用 Flutter。
不过我们还是用的 CocoaPods ,目前也没有尝试过,后期说不定有用。
- PreferencesDataStore 的默认支持
SharedPreferences 默认使用 PreferencesDataStore 了而不是 SharedPreferences 了,这...我只能说太激进了。不过对于开发者和用户来说没什么区别,API还是那样。
- 对 profiler 和 Links 工具进行优化做出了常规改进。
这一点我倒是有感触,确实好用了很多。
后记
本文大致介绍了 3.24 版本的新特性和修复的问题,以及升级到 3.24 需要注意的坑。
总的来说还是比较顺畅的,目前用了一段时间也没有回退版本的打算,还行,大家有此需求也可以放心冲。
今天的分享就到这里啦,当然如果你有其他的问题或者踩坑点,也希望大家能评论区交流一起学习进步。如果我的文章有错别字,不通顺的,或者代码、注释、有错漏的地方,同学们都可以指出修正。
如果感觉本文对你有一点的启发和帮助,还望你能点赞
支持一下,你的支持对我真的很重要。
Ok,这一期就此完结。
转载自:https://juejin.cn/post/7410599171122839591