Skip to content

Migrating to null safety on Dart

いよいよ Dart の null safety が stable となりました. これまで何回か紹介しているライブラリ ipaddr を null safety にしていく過程をメモしておきます. 参考までに pullrq は下記です.

Sound null safety

ドキュメントどおりに進めていきます.

Migrating to null safety

まずは使用しているライブラリで null safety に対応してないものがないかを確認します. ここでつまずくと何もできないです. ipaddr ではライブラリをほぼ使っていないので下記の通りでした.

$ dart pub outdated --mode=null-safety
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 Latestdev_dependencies:
pedantic ✗1.9.2 ✓1.11.0 ✓1.11.0 ✓1.11.0
test ✗1.15.7 ✓1.16.5 ✓1.16.5 ✓1.16.52 upgradable dependencies are locked (in pubspec.lock) to older versions.
To update these dependencies, use `dart pub upgrade`.

依存関係に問題が無かったので pub upgrade します. null-safety オプションを付けて実行すると pubspec.yaml をいい感じに書き換えてくれます.

$ dart pub upgrade --null-safety
$ git diff -U0
diff --git a/pubspec.yaml b/pubspec.yaml
index e20a246..24695a1 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -10,2 +10,2 @@ dev_dependencies:
- pedantic: ^1.8.0
- test: ^1.6.0
+ pedantic: ^1.11.0
+ test: ^1.16.5
$ dart pub get

いよいよ migrating です. サポートツールがあるので下記の通り実行します. Web GUI を見ろと言われるので見ます.

$ dart migrate

あとは ! maker を付けて non-nullable であることを指定するなどを行っていきます. 終わったら APPLY MIGRATION ボタンクリックで適応されます. めっちゃ楽ですね.

IPv4Address コンストラクタでは null を許容しないようになるので null チェックが常に false になるなども表示されます. ignore: unnecessary_null_comparison を指定することで引き続き null check を記載することも可能です.

migrating が終わったらコード解析とテストも忘れずにやっておきます.

$ dart analyze
$ dart test

はい,これで終了です. サポートツールが便利なのであっけなく終わりました. package version はメジャーバージョンをあげることを推奨されているので,特に強いこだわりがなければそれで良さそうです.