Open2

Flutter Dart null安全への移行

ピン留めされたアイテム
hirothingshirothings

まずパッケージを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種類

  1. マイグレーションツール(dart migrate)を使う
  2. 手動で対応する

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)
https://www.youtube.com/watch?v=bvq7wbn4VAA

Migrate to null safety
https://dart.dev/null-safety/migration-guide

hirothingshirothings

個人アプリにマイグレーションツールを使ってみた感想

マイグレーションツールは変更のプレビューを確認できることがメリットなので、注釈をつけながら複数人で地道にnull-safety化する場合は使えるかもしれない

ただ、マイグレーションツールはrequiredにしてもいいプロパティを判断してnon-nullにすることはできないので、基本的にnullableに書き換える提案をしてくる。
それを1つずつ確認しながら、判断するくらいなら 手動マイグレーション をやった方が手っ取り早いと思った。

  • Dart2.12.0~にpubspec.yamlを書き換える
  • nullチェックできていない箇所はコンパイルエラーになる
  • エラーが全てなくなるまでコードを書き換える

個人開発レベルでは手動マイグレーションした方がいい。が個人的な結論
どこかのタイミングでチーム開発でもエイヤと移行しないといけないので、チーム開発でもツールはプレビュー程度に留めてエイヤと手動対応した方が良いかと思う