稀土掘金技术社区

【Fultter】版本迭代这么快,Flutter 3.24 冲不冲?先踩为敬!

点击关注公众号,“技术干货” 及时达!

Flutter升级3.24版本的流程

前言

Fultter 的版本更新一直都是比较快的,对于开发者来说不是每次都更新到最新的版本就万事大吉,我们一般都是用一段时间来定一个版本,再观望其效果和对应的生态,最终决定是否升级。

我们开发者主要看的是 Flutter 的渲染性能,插件的支持兼容程度,是否存在严重的 Bug 和一些废弃的 API 和 Widget 的修改,是否新增了想要的控件等等因素。

现在,Flutter 3.24 以及 Dart 3.5 在稳定渠道的推出,我个人觉得比较不错。此次更新通过优化渲染引擎和内存管理使得性能显着提升,应用运行更加流畅。并且修复了一些 Bug,是我个人比较不错的推荐升级一个版本。

我个人比较推荐3.16 3.19 3.24这几个版本,我个人的电脑也安装了这三个版本。目前从3.19升级到3.24的过程有哪些坑,修复了哪些问题,哪些需要注意的位置,在网页中我会给大家指出,也希望大家少踩坑了。

一、升级流程

如果想替换之前的版本那么直接运行flutter升级即可。如果想有多个Flutter版本,那么可以到官网下载对应版本的Flutter到本地,配置对应的环境变量即可。【传送门】

我个人使用的是第二种方式,配置了多个 Fultter 版本。

配置完成之后可以查看环境变量以及输出命令

Image

别忘记了配置AS中对应项目的Flutter版本,不然也不会有效果哦。

Image

二、变动

  1. ModalRoute 的便利

由于最初涉及在 Web 端上按 Tab 键切换焦点的问题,原来到 ModalRoute 的类

Image

最终导致的是移动端的跳转页面返回页面会造成页面的重建,只要使用到 ModalRoute 类进行监听去获取路由参数等操作都会导致重建。

Image

可以看我们的页面 onPause 和 onResume 是可以正常触发的,但是每次 onPause 和 onResume 的时候就会重新构建一次,听说 Fultter 3.24 版本修复了这个漏洞。

Image

本质上就是新添加了几个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观察者

现在毫无例外修改,你仍然会重建的困扰,那么我们只能回到原点,如果真的想要这种方式确实不重复构建页面,我们也只能源码这种方式暂时解决这个问题把Web端的那个注释掉了。

在ModalRoute类中修改如下代码:

Image

或者我们抛弃这种方式使用visibility_detector的方式监听页面,具体可以参考我之前的文章。

  1. 你的变动

默认支持了 Material You 的风格,但是国内的开发环境,懂的都懂,用完全达不到直接是负体验,甚至我们需要增强一些 Material You 的效果,比如入口的配置设置,Appbar 的滚动可视化处理等等。

  1. 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即可。

  1. 无法运行的问题

无论你是否支持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 文件需要替换依赖方式哦。

三、新功能

  1. 新的 Sliver 组件:Flutter 3.24 引入了新的 Sliver 组件,允许开发者实现动态的应用栏行为,如浮动、固定或调整大小的头部设计,使 UI 更加灵活和交互。
  • 细长浮动标题
  • 固定标题条
  • SliverResizingHeader

之前这篇文章我们讲过,其实就是Appbar的各种行为的一个封装,可以去掉Appbar这个控件单独搭配其他的控件使用。

  1. 新的控件TreeView

这个其实也很好理解,它用于构建可以在所有方向的滚动的升级树形结构,关键是它支持各种方向的滚动,很好用。并且还生成了TreeSliver配合需要在列表中使用。我们自定义实现的,现在官方给我们落实了。

  1. 新的控件轮播查看轮播

简单的轮播控件我们都是一般使用第三方的插件,好用的轮播插件太多了,这里官方出的轮播比较,如果是简单的轮播需求不想导入第三方的插件可以试试。

  1. 叶轮性能优化

老生谈的问题,一直在优化中。

  1. iOS 的 Swift 包 部分支持

支持初步的访问 Swift 包生态系统。Flutter 插件将能够利用不断增长的 Swift 包生态系统!简化 Flutter 安装。

Swift Package Manager 与 Xcode 捆绑在一起。未来,开发者安装 Ruby 和 CocoaPods 就可以在 Apple 平台上使用 Flutter。

我们还是用 CocoaPods ,目前也没有尝试过,但是高级说不定有用。

  1. PreferencesDataStore 的默认支持

SharedPreferences 默认使用 PreferencesDataStore 了而不是 SharedPreferences 了,这...我只能说太激进了。不过对于开发者和用户来说没什么区别,API 还是那样。

  1. 对探查器和链接工具进行了优化,取得了常规改进。

这一点我倒是有触感,确实好用了很多。

后续

本文详细介绍了3.24版本的新特性和修复的问题,以及升级到3.24需要注意的坑。

总的来说还是比较以上的,目前用了一段时间也没有回退版本的打算,还行,大家有此需求也可以放心冲。

今天的分享就到这里啦,当然如果你有其他的问题或者踩坑点,也希望大家能评论区交流一起学习进步。如果我的文章有错别字,不通顺的,或者代码、注释、有错漏的哪里,同学们都可以指出修改。

如果感觉这篇文章对你有一点启发和帮助,还希望你能点赞支持一下,你的支持对我真的很重要。

Ok,这一期就此结束。

Image