Flutter Dart null安全への移行
まずパッケージをnull safety版に移行する
依存関係の一番親のところからマイグレーションすることを推奨
自分のアプリのコードを先に変更してもパッケージのnull-safety対応で再修正が発生する可能性があるため全ての依存パッケージがnull-safety版になってからマイグレーションを行うことを強く推奨されている
null-safety版のパッケージはnull-safety対応していないパッケージでも利用できる。
つまり自分のアプリがまだnull-safetyじゃなくてもコアライブラリだけ移行しておく。など徐々にnull-safety対応できる
flutter pub outdated --mode=null-safety
でアプリの依存パッケージが、null-safety対応しているか確認ができる
- [✗] 未対応
- [✓] null安全対応
dart pub upgrade --null-safety
で依存パッケージをNull-Safety版の最新にアップデートできる
このコマンドはpubspec.ymlを書き換える
対応していないパッケージ一覧も出してくれるので便利
対応していないものを除いてアップデートできるコマンドも吐き出してくれるので便利
null-safety compatible versions do not exist for:
- vibrate
- native_shared_preferences
...
マイグレーション手段は2種類
- マイグレーションツール(dart migrate)を使う
- 手動で対応する
dart migrate
準備
- Dart or Flutter SDKを最新バージョンにして、
dart --version
してDart2.12.0になっていることを確認(null安全のstable版) - ⚠️pubspec.yamlのDartバージョンは2.12.0以前にすること⚠️
- コンパイルエラーでマイグレーションツールが起動できないため
- 2.12.0以上でmigrateしようとすると注意される
Set the lower SDK constraint (in pubspec.yaml) to a version before 2.12.
migrate実行
-
dart migrate
でマイグレート - Xcodeのマイグレーションツールのように、マイグレート結果のシミュレーションをブラウザで確認できるので、必要に応じて、コードに反映する
実際にマイグレーションツールを走らせた画面
- 変更反映したいファイルをチェックして
APPLY MIGRATION
をするとコードに反映できる -
RERUN FROM SOURCES
をクリックして変更後の内容をプレビューに反映できる
マイグレーションツールの挙動
- migrationツールは控えめな動作をする。nullableだと基本的に判断する
- 右ペインでnullableだと判断した経緯を確認できる
- Add
/*!*/
hintを選択することで、注釈(ヒントマーカー)を付けられる- ヒントマーカーがあることで、日を跨いだ長期作業になっても確認ポイントを常に意識することができる
- Statefulウィジェットを使っている場合など、遅延初期化
late init
で済むメンバ変数もツールはnullableとして判断する- その場合は自分で判断する
- ヒントマーカーをつける
/*late final*/
/*late*/
- コードを書き換える
- ヒントマーカーをつける
- その場合は自分で判断する
手動でマイグレーションする
pubspec.yamlのDart SDKを2.12~に書き換える
environment:
sdk: '>=2.12.0 <3.0.0'
nullチェックできていない箇所はコンパイルエラーになるので、必要に応じて修正する
参考記事
アプリを null 安全に移行する (Flutter Engage)
Migrate to null safety
個人アプリにマイグレーションツールを使ってみた感想
マイグレーションツールは変更のプレビューを確認できることがメリットなので、注釈をつけながら複数人で地道にnull-safety化する場合は使えるかもしれない
ただ、マイグレーションツールはrequired
にしてもいいプロパティを判断してnon-nullにすることはできないので、基本的にnullableに書き換える提案をしてくる。
それを1つずつ確認しながら、判断するくらいなら 手動マイグレーション
をやった方が手っ取り早いと思った。
- Dart2.12.0~にpubspec.yamlを書き換える
- nullチェックできていない箇所はコンパイルエラーになる
- エラーが全てなくなるまでコードを書き換える
個人開発レベルでは手動マイグレーションした方がいい。が個人的な結論
どこかのタイミングでチーム開発でもエイヤと移行しないといけないので、チーム開発でもツールはプレビュー程度に留めてエイヤと手動対応した方が良いかと思う