Flutter项目迁移到Null Safety


相关文章:


  1. 创建分支命名为flutter2_null-safety,并切换到新分支。
  2. 项目中使用了fvm,执行fvm use stable,使用Flutter最新的stable分支。
  3. 执行flutter doctor
$ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 2.2.3, on macOS 11.5.1 20G80 darwin-x64, locale zh-Hans-CN)
[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
[✓] Xcode - develop for iOS and macOS
[✓] Chrome - develop for the web
[✓] Android Studio (version 2020.3)
[✓] Connected device (2 available)

• No issues found!

  1. 查看dart版本,是否为2.12或更高
$ dart --version
fvm: running Dart from Flutter "stable"

Dart SDK version: 2.13.4 (stable) (Wed Jun 23 13:08:41 2021 +0200) on "macos_x64"
  1. 检查所有依赖的迁移状态
$ dart pub outdated --mode=null-safety
fvm: running Dart from Flutter "stable"

Showing dependencies that are currently not opted in to null-safety.
[✗] indicates versions without null safety support.
[✓] indicates versions opting in to null safety.

Package Name                     Current        Upgradable  Resolvable  Latest                 

direct dependencies:            
amap_location                    ✗0.2.0 (git)   -           -           ✗0.2.0 (git)           
audioplayers                     ✗0.17.4 (git)  -           -           ✗0.17.4 (git)          
azlistview                       ✗0.1.2         -           -           ✓2.0.0-nullsafety.0    
badges                           ✗1.2.0         -           -           ✓2.0.1                 
barcode_scan                     ✗2.0.2         -           -           ✗3.0.1                 
cached_network_image             ✗2.5.1         -           -           ✓3.1.0                 
chewie                           ✗0.12.2        -           -           ✓1.2.2                 
connectivity                     ✗2.0.2         -           -           ✓3.0.6                 
date_range_picker                ✗1.0.7         -           -           ✗1.0.7                 
device_info                      ✗1.0.0         -           -           ✓2.0.2                 
dio                              ✗3.0.10        -           -           ✓4.0.0                 
event_bus                        ✗1.1.1         -           -           ✓2.0.0                 
exifdart                         ✗0.7.0+3       -           -           ✓0.8.0-dev.2           
fdottedline                      ✗1.0.1         -           -           ✗1.0.1                 
flutter_app_badger               ✗1.1.2         -           -           ✓1.2.0                 
...
...
...     

dev_dependencies:               
build_runner                     ✗1.11.1        -           -           ✓2.0.6                 
No resolution was found. Try running `dart pub upgrade --null-safety --dry-run` to explore why.
  1. 依赖迁移优先级
    A依赖B,B依赖C,迁移顺序为:C > B > A。

  2. 对本地引入的库分析是否具备迁移条件
    ① 几个自己定义的插件库库已经创建了null-safety分支做了迁移支持。
    ② 其他三方的库也都找到了可替换了null-safety库。
    ③ 本地引入的插件,替换为git方式引入,创建null-safety分支,做迁移支持。

以上所有插件,保证都具备迁移条件。

如果插件还没迁移,使用以下第⑧条的方法先将插件迁移,迁移完之后,使用null-safety分支。

  talkingdata_appanalytics_plugin:
    git:
      url: http://*******/*******/app_analytics_sdk_flutter.git
      ref: null-safety
  1. 开始迁移
    fvm use stable
    dart --version确保使用的dart为最新版本
    ③ 运行 dart pub outdated --mode=null-safety 以确保所有依赖为最新且空安全。
$ dart pub outdated --mode=null-safety
fvm: running Dart from Flutter "stable"

Showing dependencies that are currently not opted in to null-safety.
[✗] indicates versions without null safety support.
[✓] indicates versions opting in to null safety.

All your dependencies declare support for null-safety.

如果依赖没有更新到最新版本,比如以下:

$ dart pub outdated --mode=null-safety
fvm: running Dart from Flutter "stable"

Showing dependencies that are currently not opted in to null-safety.
[✗] indicates versions without null safety support.
[✓] indicates versions opting in to null safety.

Package Name   Current  Upgradable  Resolvable  Latest   

direct dependencies:
path_provider  ✗1.6.22  -           ✓2.0.2      ✓2.0.2   
uuid           ✗2.2.2   -           ✓3.0.4      ✓3.0.4   

dev_dependencies:
http           ✗0.12.2  -           ✓0.13.3     ✓0.13.3  
No resolution was found. Try running `dart pub upgrade --null-safety --dry-run` to explore why.

3  dependencies are constrained to versions that are older than a resolvable version.
To update these dependencies, edit pubspec.yaml, or run `dart pub upgrade --null-safety`.

运行 dart pub upgrade --null-safety 将依赖升级至支持空安全的最新版本。 注意: 该命令会更改你的 pubspec.yaml 文件。

④ 在包含 pubspec.yaml 的目录下,执行 dart migrate 命令,启动迁移工具。

$ dart migrate 
fvm: running Dart from Flutter "stable"

Migrating /Users/yuanzhiying/Desktop/app_analytics_sdk_flutter

See https://dart.dev/go/null-safety-migration for a migration guide.

Note: more than one project found; migrating the top-level project.

Analyzing project...
No analysis issues found.

Generating migration suggestions...
Compiling instrumentation information...
View the migration suggestions by visiting:

  http://127.0.0.1:52996/Users/yuanzhiying/Desktop/app_analytics_sdk_flutter?authToken=zbeBO82KY54%3D

Use this interactive web view to review, improve, or apply the results.
When finished with the preview, hit ctrl-c to terminate this process.

If you make edits outside of the web view (in your IDE), use the 'Rerun from
sources' action.

⑤ 访问http://127.0.0.1:52996/Users/yuanzhiying/Desktop/app_analytics_sdk_flutter?authToken=zbeBO82KY54%3D浏览器打开,根据提示或具体情况处理代码。

image.png

工具给推荐了默认的处理方法,点击代码,可以看到右侧Proposed Edits里有具体的说明。在迁移工具的 Edit Details 窗格中,你可以通过 Add /*?*/ hintAdd /*!*/ hint 按钮来添加提示标记。

按下这些按钮,相应的标记会立刻添加到代码中,并且 无法撤销。如果你想删除标记,可以和平常一样使用代码编辑器删除它。

就算迁移工具正在运行,你也可以使用编辑器添加提示标记。由于你的代码还未迁移到空安全,所以无法使用空安全的新特性。但是你可以进行与空安全无关的改动,例如重构。

当你完成编辑后,点击 Rerun from sources 进行更改。

image.png

⑥ 只进行部分文件的迁移
尽管我们希望你能一次性完成迁移工作,但对于大体量的应用或 package 而言并不是简单的事。如果你想只迁移部分文件,请将暂时不迁移的文件前方的绿色勾选框取消勾选。稍后应用迁移更改时,这些文件会加上 Dart 2.9 [版本注释][version comment],其他内容保持不变。

更多有关渐进迁移空安全的内容,请阅读 非健全的空安全

⑦ 处理完之后,再次执行dart migrate

$ dart migrate
fvm: running Dart from Flutter "stable"

Migrating /Users/yuanzhiying/Desktop/app_analytics_sdk_flutter

See https://dart.dev/go/null-safety-migration for a migration guide.

Note: more than one project found; migrating the top-level project.

Analyzing project...
All sources appear to be already migrated.  Nothing to do.

9、迁移完成


非健全的空安全

一个 Dart 程序可以同时包含已经是 空安全 和未迁移至空安全的库。这些 混合模式的程序 会运行在 非健全的空安全 下。

为了在保持与传统库运行时的兼容性的同时,能为健全的空安全程序提供健全性,Dart 工具提供了以下两种模式的支持:

  • 以 非健全的空安全 运行的混合模式的程序。在运行时有可能出现 null 引用错误,但这只是因为一些 null 值和可空类型在非空安全的库中污染了空安全的代码。
  • 当程序完全迁移至空安全,且它所依赖的库 全部 都迁移完成后,它就在以 健全的空安全 运行,拥有所有由健全性带来的保证和编译优化。

逐步迁移

因为 Dart 支持混合模式的空安全,所以你可以一个个迁移你的库(通常是一个文件),同时能正常运行程序和测试。
我们推荐你 优先迁移最下层的库 —— 指的是没有导入其他包的库。接着迁移直接依赖了下层库的依赖库。最后再迁移依赖项最多的库。
举个例子,假设你的 lib/src/util.dart 导入了其他(空安全)的软件包和核心库,但它没有包含任何 import '<本地路径>'的引用。那么你应当优先考虑迁移 util.dart,然后迁移依赖了 util.dart 的文件。如果有一些循环引用的库(例如 A 引用了 BB 引用了 CC 引用了 A),建议同时对它们进行迁移。

使用迁移工具

你可以使用 迁移工具 进行渐进迁移。如果你需要排除部分文件或文件夹,勾选绿色的勾选框。下方的截图中,bin 文件夹的所有文件都已被排除。

image.png

每个不迁移的文件都会加上 2.9 语言版本的注释。你可以之后再次运行 dart migrate 继续迁移。已迁移的文件将显示为禁用的勾选框,它们无法撤销迁移更改。

测试或运行混合版本的程序

想要测试或运行混合版本的代码,你需要禁用健全的空安全。有两种方式可以进行操作:

  • dartflutter 命令里,加入 --no-sound-null-safety 标记禁用。例如:
$ dart --no-sound-null-safety run
$ flutter run --no-sound-null-safety
  • 或者,设定程序入口的语言版本 —— 包含 main() 函数的文件 —— 设定为 2.9。在 Flutter 应用中,一般是 lib/main.dart。在命令行应用中,一般是bin/<package 名称>.dart。同时你也可以设定test下的文件,因为它们也包含程序入口。例如
// @dart=2.9
import 'src/my_app.dart';

main() {
  //...
}

以上两种方式的规避,对于 正在 增量迁移的过程非常有用,但这样做意味着你并未在完全启用空安全的情况下测试你的代码。当你完成增量迁移后,也请记得将测试代码 重新 迁移至空安全。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容