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

智能推荐

国产Type-C PD芯片:USB-C接口快充取电芯片_充电口 圆口 csdn-程序员宅基地

文章浏览阅读1.5k次,点赞8次,收藏11次。LDR6328:◇ 采用 SOP-8 封装◇ 兼容 USB PD 3.0 规范,支持 USB PD 2.0◇ 兼容 QC 3.0 规范,支持 QC 2.0 ,华为SCP协议◇ 可自动诱骗 PD 输出 5V、9V、12V 电压,QC 输出 9V、12V 电压(可定制支持最大20V电压)LDR6328S:◇ 采用 SOP-8 封装◇ 兼容 USB PD 3.0 规范,支持 USB PD 2.0◇ 兼容 QC 3.0 规范,支持 QC 2.0◇ 支持 AFC 协议。_充电口 圆口 csdn

java计算机毕业设计教务排课系统MyBatis+系统+LW文档+源码+调试部署-程序员宅基地

文章浏览阅读135次。java计算机毕业设计教务排课系统MyBatis+系统+LW文档+源码+调试部署。springboot基于springboot的健身俱乐部综合管理系统。ssm基于vue框架的疫情防控知识在线答题系统设计与实现。JSP鸡厂养殖管理系统的设计与实现sqlserver。ssm基于HTML的“忆红楼梦之味”网站设计与实现。ssm基于ssm的再生产公益管理系统的设计与实现。ssm基于SSM的停车场收费管理系统的设计与实现。ssm基于SSM的民宿预订管理系统设计与实现。jsp基于Java的高速公路服务区管理系统。

Ubuntu关机和重启的命令_ubuntu 重启windows-程序员宅基地

文章浏览阅读1.1w次。linux下常用的关机命令有:shutdown、halt、poweroff、init;重启命令有:reboot。下面本文就主要介绍一些常用的关机命令以及各种关机命令之间的区别和具体用法。关机命令:1、halt 立刻关机 2、poweroff 立刻关机 3、shutdown -h now 立刻关机(root用户使用) 4、shutdown -h 10 10分钟后自动关机 如果是通过sh..._ubuntu 重启windows

计算机网络 互联网模拟实验_网间互联模拟-程序员宅基地

文章浏览阅读1k次,点赞3次,收藏2次。计算机网络互联网模拟实验_网间互联模拟

python excel 数据分析统计服_数据分析从入门到进阶(透彻讲解EXCEL.SQL.TABLEAU、PYTHON四项数据分析必会工具.免费提供1GB数据集...-程序员宅基地

文章浏览阅读703次。透彻讲解Excel、SQL、Tableau、Python四项数据分析必会工具,数据分析工作者的案头推荐工具书。系统介绍数据分析的策略、方法(数据分析之道);实例讲解引导、快速掌握数据分析工具(数据分析之术);免费提供书中涉及的全部数据集文件、数据库源文件、程序代码(1GB)。很好实用的数据分析学习用书。本书由一线数据分析师精心编写,通过大量案例介绍了数据分析工作中常用的数据分析方法与工具。本书包括..._excel 结合sql常用工具软件

MySQL基础篇第1章(数据库概述)_mysql第一章-程序员宅基地

文章浏览阅读197次。师承尚硅谷_mysql第一章

随便推点

打印当前进程线程的名称和数量-程序员宅基地

文章浏览阅读447次,点赞10次,收藏9次。【代码】打印当前进程线程的名称和数量。

Glide图片框架使用详细介绍(一),Github上最值得学习的10个Android开源项目_com.github.bumptech.glide的作用-程序员宅基地

文章浏览阅读628次,点赞11次,收藏29次。在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫 Glide 的图片加载库,作者是bumptech。这个库被广泛的运用在google的开源项目中,包括2014年google I/O大会上发布的官方app。Picasso本身就是简单方便的图片加载框架,Glide是在Picasso的基础上进行改良的,更加好用。优点有:使用简单可配置度高,自适应程度高支持常见图片格式 Jpg png gif webp支持多种数据源 网络、本地、资源、Assets 等。_com.github.bumptech.glide的作用

基于MATLAB的车牌识别研究-程序员宅基地

文章浏览阅读21次。随着我国公路事业的发展,人工管理方式已经不能满足如今实际的需要。车牌识别技术是计算机视频图像识别技术在车辆牌照识别中的一种应用,是现代智能交通系统(Intelligent Traffic System,简称ITS)中的重要组成部分之一。车牌识别系统(vehicle license plate recognition system,简称LPR)使车辆管理更加智能化、数字化,有效提升了交通管理的效率。对于交通管理、治安处罚等工作的智能化起着十分重要的作用。它可广泛应用于交通流量检测,交通控制与诱导,机场、港

梯度下降 (Gradient Descent)_梯度下降公式-程序员宅基地

文章浏览阅读3.6k次。梯度下降是一个用来求函数最小值的算法,将使用梯度下降算法来求出代价函数.梯度下降背后的思想是:开始时随机选择一个参数的组合$\left( {\theta_{0}},{\theta_{1}},......,{\theta_{n}} \right)$,计算代价函数,然后寻找下一个能让代价函数值下降最多的参数组合。持续这么做直到找到一个局部最小值(**local minimum**),因为并没有尝试完所有的参数组合,所以不能确定得到的局部最小值是否便是全局最小值(**global minimum**),选择不同的_梯度下降公式

redis常见问题及解决方案-程序员宅基地

文章浏览阅读5k次,点赞3次,收藏21次。redis的性能并不受CPU的运行速度,影响redis性能的是网络带宽和内存大小。redis常见问题及对应解决方案:一、缓存穿透:就是查询一个压根就不存在的数据,即缓存中没有,数据库中也没有解决方案:使用布隆过滤器,把数据先加载到布隆过滤器中,访问前先判断是否存在于布隆过滤器中,不存在代表这笔数据压根就不存在。缺点:布隆过滤器是不可变的,可能一开始过滤器和数据库数据时一致的,后面数据库数据变了,或变多或变少,而对应的布隆过滤器的数据也要改变,这时会比较麻烦。二、缓存击穿:数据库中_redis常见问题及解决方案

MySQL批量导入数据时,为何表空间膨胀了N倍-程序员宅基地

文章浏览阅读417次。本文目录问题缘起排查思路问题发现问题缘起同事在客户现场利用DTS工具,从A实例将数据迁移到B实例过程中,发现几乎稍大点的表在迁移完成后,目标端表空间大小差不多都是源端的3倍,也就是说表空间膨胀了2倍。排查思路对这篇文章《叶问》第16期有印象的话,应该还能记得,数据迁移(导入导出)过程中,也包括主从复制场景,导致表空间膨胀的原因有几种:MySQL表默认是InnoDB引擎且目前索引只支持B+树索引..._mysql csv 导入后 体积变大

推荐文章

热门文章

相关标签