Flutter2がStableになったのでNull Safetyしたかったのですが2021/3はじめ時点ではかなり情報も少なかったため、とにかく試行錯誤で雑にNull Safety対応した記録です。
stableチャンネルにしているのにもかかわらずなぜか flutter upgrade
してもFlutter1から2に上がらなかったのと、あとは仕事のプロジェクトのバージョンは2にあげられないというのもあり、fvmというFlutterのバージョン管理ツールを使うことにしました。
https://github.com/leoafarias/fvm
これでバージョン2をインストールしました。
Flutterをバージョン2にあげただけではNull Safetyが有効になりません。 String?
とかの型を使うと、下記のようなエラーが出ます。
This requires the 'non-nullable' language feature to be enabled.
Try updating your pubspec.yaml to set the minimum SDK constraint to 2.12.0 or higher, and running 'pub get'.
ということでpubspec.yamlにて、SDKのバージョンを2.12.0にします。
environment:
sdk: '>=2.12.0 <3.0.0'
これでNull Safetyが有効になり、大量にエラーが出てくれるようになります。あとはまあ色んな記事を参考にしつつ手動なり、マイグレーションツールを使うなりして修正していきましょう。僕はそんなに量が多くないプロジェクトだったのと、実際にNull Safetyを触ってみたかったので手動で修正していきました。
Gitを使っていない方は修正前の状態をGitでコミットしていつでも元に戻せるようにしておくと良いでしょう。
あとは各種パッケージもアップグレードしていきます。現時点でもNull Safety対応のバージョンを出しているパッケージが既にたくさんありますので、とにかくどんどん pub get
のエラーを見つつアップグレードしていきます。
実行すると、Null Safety非対応のパッケージが混じっていることでエラーになり実行ができません。
Error: Cannot run with sound null safety, because the following dependencies
don't support null safety:
- package:google_mobile_ads
For solutions, see https://dart.dev/go/unsound-null-safety
ということで現れたURLなどを参考に調べてみると、実行時に --no-sound-null-safety
のようなパラメータをつければ非対応パッケージが混ざっていても実行できるっぽいため、そのパラメータ付きで実行します。VSCodeのlaunch.jsonは下記のような感じです。他にも使っているパラメータがあれば適宜追記してください。
{
"version": "0.2.0",
"configurations": [
{
"name": "Flutter Debug",
"type": "dart",
"request": "launch",
"program": "lib/main.dart",
"args": [
"--no-sound-null-safety"
]
}
]
}
flutter build ios
だけだとエラーになるので、先程と同様のパラメータを付けます。
flutter build ios --no-sound-null-safety
これでアプリリリースまで行けました。
とりあえずこれでAndroidはデバッグ実行できるところまで確認できました。本番ビルドは未検証です。
今回は雑なやりかたのパターンですので、しっかりやる場合は他の記事なども参考にすると良いでしょう。
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント