Flutter 升级 2.0 填坑指导,带你原地起飞_because flutter_styled_toast >=2.0.0 depends on fl-程序员宅基地

技术标签: Android开发  flutter  android  ios  

Flutter 2.0 的发布带来了很多的 break change ,特别是新增加的空声明安全,相信不少大哥尝鲜之后立马反思自己“手贱” ,事实上旧项目升级 Flutter 2.0 确实有很多兼容的点,但是“吃螃蟹”其实我们可以逐步拆解,比如“先蒸熟了再吃”?

其实正如《 Dart 2.12 发布,稳定空安全声明和FFI版本》 里所说,升级到 Flutter 2.0 并不会强制要求你马上使用空声明安全 ,所以我们可以把整个升级适配过程拆解几步来完成,最终完成 2.0 的升级适配。

1、针对 API 的调整

首先你需要先将本地的 Flutter SDK 升级到 2.0 以上的版本,升级完成之后首先确保 Dart SDK 的 environment 小于 2.12.0 , 可以选中 2.10.0 之类的版本,如下所示的配置是不需要针对空声明安全进行适配,接下来我们就可以针对 SDK API 的 break change 先进行适配调整。


environment:
  sdk: '>=2.10.0 <3.0.0'

首先你会应该遇到最多的应该是 List 对象的修改,因为 factory List 的函数已经被 Deprecated ,所以你需要使用 [] 或者 List.filled 来替换你原有的实现,从这开始就是“体力活”了。

image.png

常见的还有 runZonedonError 参数也被 Deprecated ,需要使用 runZonedGuarded 来替代。

一般使用 runZoned 的都是用于对 Dart 层做错误信息收集。

Stack 控件的 overflow 参数也被 Deprecated ,需要替换为 clipBehavior,比如以前的 Overflow.visible 可以修改为 Clip.none ,默认情况下是 Clip.hardEdge

image.png

FlatButton 也被标志为弃用,需要替换成 TextButton;类似的 RaisedButton 需要替换为 ElevatedButton

这里主要需要注意的是: FlatButtonRaisedButton 上的 paddingcolor 等方法现在需要使用 ButtonStyle 来设置。

image.png

类似的还有 Scaffold.of(builderContext).showSnackBar 方法需要替换为 ScaffoldMessenger.of(builderContext).showSnackBar 使用。

image.png

最后还有:

  • ScaffoldresizeToAvoidBottomPadding 参数正式取消,需要使用 resizeToAvoidBottomInset 参数替代。

  • Theme.of(context, shadowThemeOnly: true)shadowThemeOnly 参数正式取消。

  • 官方新增了 DateUtils'package:flutter/material.dart' 里,可能会与你的项目里的 DateUtils 命名冲突。

  • Localizations.localeOf(context, nullOk: true)MediaQuery.of(context, nullOk: true)nullOk 参数正式取消。

大致上我遇到的 break change 或者弃用警告就是上面这些,调整完后在没有打开空安全配置的情况下,是可以正常运行的。

当然你也可能遇到:修改完后依旧无法运行的情况,因为还有第三方插件包依赖需要调整。

2、针对依赖仓库的调整

虽然 Flutter 2.0 没有要求主项目一定使用空声明安全,但是对于插件的适配要求却比价严格,所以你仍可能需要升级一些 pub 仓库的依赖来完成适配。

前提是祈祷你使用插件包有适配 null-safety

如图所示,正常支持 null-safety 的包在 pub 官网上是有 Null safety 的标签或者 nullsafety 的预览版本,这时候只要修改你的依赖版本,使用支持空声明安全的插件版本就可以了。

image.png

完了吗?明显没有!

因为大量的插件升级就可能带来版本冲突,比如 analyzer 版本冲突,在 json_serializablebuilt_value_generator 中他们分别依赖了不同的 analyzer 版本,所以会有版本冲突问题。

image.png

另外比如 build_runnergraphql 的版本之间存在 web_socket_channel 的冲突。

image.png

这些冲突要怎么解决呢?这里给大家展示使用 dependency_overrides 临时解决这些冲突。

如下图所示,可以看到在 dependency_overrides 下我强行使用了 analyzer: 1.1.0web_socket_channel ,这样运行之后 analyzerweb_socket_channel 的版本会被强制指定,从而忽略冲突来解决无法运行的问题。

另外在我的 dependency_overrides 里可以看到很多带有 # 的注解版本,这些版本都是在遇到冲突之后,为了成功运行一个个添加上去,之后在对应插件更新支持兼容后才注释掉。

image.png

image.png

添加了 dependency_overrides 之后运行会有 Warning 提示,这部分忽略就行了。

image.png

3、针对空声明安全的调整

在完成上面两个步骤,项目应该就可以在 Flutter 2.0 上运行,那接下来就是把版本升级到空安全声明的支持,当然前提是你想要使用 null safety

升级到空安全声明,推荐使用官方的 dart migrate 命令,命令会生成一个可视化的界面,引导你将项目迁移到空安全声明,并且自动帮你覆盖代码。

如果你还有插件没有完全支持空安全声明,那么可以使用 dart migrate --skip-import-check 来完成迁移。

image.png

运行后可以看到一个链接,点击如图所示链接就可以打开引导界面,引导界面上可以看到每个文件会被修改位置和数量,你可以自己重新调整内容后点击刷新,或者直接点击 APPLY MIGRATION 按键,之后再到项目里进行修改。

image.png

相信我,修改后肯定会有一堆报错和警告,不要担心,这是正常的,接下来就是“体力活”了。

首先某些地方可能会被修改为如下图所示代码,你只需要对应修改回来就好,自动覆盖的脚本确实有些傻。

image.png

有时候某些 await 语法会被强行增加 as FutureOr ,如果你不需要改为原来的声明就可以。

image.png

还有比如 compute 方法中的 Function(_) 错误提示,只需要改为对应分参数传入,比如 Function(String? data) 就可以了。

image.png

有时候一些方法定义也会被强行修改,比如 redux 相关的这些修改可能也会影响运行问题,所以只需要把 as 部分去除就可以了。

image.png

而比如这类方法报错,一般就是提供的参数和使用参数对应不上,只需要添加上 ? 即可修复。

image.png

最后有时也会使用 ! 来暂时完成适配,比如某个参数你确定不会为 null,你可以在使用时通过 ! 表示强行使用(就是任性不判空),比如下图就是对 _dragOffsetnotification.scrollDelta 的强行修改对比。

image.png

可以看到这部分内容也是纯粹体力活,虽然自动覆盖的靠谱程度肯定不高,还是需要一定的人工修改,但是这个自动化过程大大提高了迁移的效率,而在代码覆盖之后,environmentsdk 也会自动修改为 >=2.12.0

空安全声明迁移完成!

4、针对迁移中运行的调整

最后,到这里你可能会发现,升级到 dart 1.12之后,适配完 null safety 点 IDE 上的运行发现还是运行不起来,比如下图所示:

image.png

这是因为你还有没有迁移完成的依赖包,但是有时候依赖包不是一时半会就能兼容完成,这时候应该如何适配运行呢?

这时候就可以通过 flutter run --no-sound-null-safety 命令来运行调试项目,通过此命令运行的项目并不会使用空安全声明校验,然后通过输入 r 或者 R 等就可以完成 hotload 等调试操作。

如果需要 debug 代码或者性能调试,还可以通过 chrome 浏览器打开 http://localhost:9100 地址,然后把运行得到的 Observatory 地址如: http://127.0.0.1:62145/H1PrDXLbA3w=/ 输入到 Connect 输入框,这样就可以打开 DartTools 进行调试。

image.png

最后不得不说, Flutter 2.0 算是 Flutter 新的起点,希望新的版本能给你们带来更稳定和更便捷的开发体验。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ZuoYueLiang/article/details/114686452

智能推荐

ADFS服务证书更新介绍-程序员宅基地

文章浏览阅读542次。ADFS服务证书更新介绍说到ADFS(Active Directory Federation Services)服务,相信大家都已经了解了,ADFS服务我们可以理解为SSO(单点登录),在windows服务下, 主要应用到了windows azure或者office365的用户权限登录。ADFS将活动目录拓展到Internet。要理解这一点,可以考虑一般活动目录设施的工作原理..._iis 证书 adfs/ls

Docker学习(八) -- Docker-compose容器编排_comppse pull-程序员宅基地

文章浏览阅读1.2k次。是什么docker-comppse是docker官方的开源项目,负责实现对docker容器集群的快速编排。Compose是Docker公司推出的一个工具软件,可以管理多个Docker容器组成一个应用。你需要定义一个YAML格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器..._comppse pull

for循环给list赋值是,要注意list要初始化且放过在for外面_循环内给列表初始化赋值-程序员宅基地

文章浏览阅读5.8k次。public List<Category> findAll() { Jedis jedis = JedisUtil.getJedis(); Set<Tuple> cSet = jedis.zrangeWithScores("category", 0, -1); List<Category> clist = nul..._循环内给列表初始化赋值

技术团队管理:技术分享_技术团队技术分享内容-程序员宅基地

文章浏览阅读2.9k次。这里写自定义目录标题为什么要进行技术分享如何做技术分享找人找分享主题内容准备为什么要进行技术分享技术团队,员工为什么要离职?钱没给到位?没学到技术?技术成长对初,中级开发人员来说非常重要,曾经面试过很多人,他们的梦想都是成为技术架构师,他们都很关心在你的公司能学到什么技术,对自己的技术提升大不大.只有有技术氛围的公司,不断去应用新技术的公司,才可能让开发人员留下来. 如果老的技术一直在使用..._技术团队技术分享内容

从调试器控制异常和事件:SXE、 SXD、 SXN、SXI_sxixn-程序员宅基地

文章浏览阅读1w次。控制异常和事件在用户模式和内核模式应用程序中有很多方法用于截获和处理异常。激活的调试器、即时调试器或内部的错误处理程序都是异常处理的通常方法。关于这些错误处理方式优先等级的更多信息,查看启用即时调试。当Microsoft Windows操作系统允许由调试器来处理异常时,产生异常的程序会中断到调试器。即应用程序停止运行而调试器被激活。之后,调试器可以用各种方式处理掉异常或者分_sxixn

监控显示服务器超时,监控连接服务器超时怎么解决-程序员宅基地

文章浏览阅读3.8k次。监控连接服务器超时怎么解决 内容精选换一换本文提供了分布式数据库中间件DDM产品介绍,快速入门、API接口的新特性的快速入口。您在了解云手机的优势和应用场景后,如果想体验云手机的功能,或者需要部署真实的业务,建议您参考本节操作购买云手机。操作流程如图1所示。准备工作包含两项任务:注册华为云并实名认证;创建密钥对。其中,密钥对用于鉴权,在购买服务器时要选择一个密钥对,以便连接云手机(建立SSH隧道)..._监控响应超时是什么回事

随便推点

Chart GPT 暗黑版上线,网络安全问题已经显现_暗黑版gpt-程序员宅基地

文章浏览阅读305次。Chart GPT刚刚发布,一位不知名的作者将它的孪生兄弟“DAN”就在世界上最黑暗的暗网上线了。_暗黑版gpt

二级指针和二叉树创建的问题_二叉树 二级指针-程序员宅基地

文章浏览阅读355次。二叉树创建为什么要用到到二级指针的问题_二叉树 二级指针

matlab struct 删除,matlab 中struct操作-程序员宅基地

文章浏览阅读3.8k次。结构数组的创建MATLAB提供了两种定义结构的方式:直接应用和使用struct函数。1. 使用直接引用方式定义结构与建立数值型数组一样,建立新struct对象不需要事先申明,可以直接引用,而且可以动态扩充。建立一个复数变量xx.real = 0; % 创建字段名为real,并为该字段赋值为0x.imag = 0 % 为x创建一个新的字段imag,并为该字段赋值为0x =real: 0imag: 0..._matlab 将struct结构中f字段为1的所有行去除

算法 数据结构 斐波那契数列 递归实现斐波那契数列 斐波那契递归的优化 斐波那契数列递归求解 多路递归实现 斐波那契算法系列 数据结构(十一)_算法设计基础中爬楼梯问题用斐波那契数列递归技术怎么写-程序员宅基地

文章浏览阅读766次。排查发现:当n=46是正常的,n=47时,前面两个值的相加已经超过了int最大值int.max_value= 21 4748 3647 所以出现负数。使用数组进行优化,也有一个问题,数组只有n-1, n-2两个值有用。对于计算之后,存储前面n-3的值没有了意义;尾递归(防止栈溢出) + 只取n-1, n-2的值流转。使用数组,存储之前计算的数据,减少计算次数。这种方法直接用数组去存储前面计算的值,不用重复计算。之前的例子是每个递归函数只包含一个自身的调用,这称之为 single recursion。_算法设计基础中爬楼梯问题用斐波那契数列递归技术怎么写

分区truncate操作的介绍_truncate分区需要重建索引吗-程序员宅基地

文章浏览阅读1.8w次。① 马上回收空间:  alter table table_name truncate partition partition_name drop storage;  ② 同时维护全局索引:  alter table table_name drop partition partition_name update global indexes;  ㈡ 对全局索引的作用  大分区表t_truncate分区需要重建索引吗

软件测试之如何介绍自己的项目_系统测试项目介绍怎么做-程序员宅基地

文章浏览阅读1.4w次,点赞28次,收藏267次。面试中如何介绍自己的项目_系统测试项目介绍怎么做

推荐文章

热门文章

相关标签