2021-03-22に更新

Flutter2で雑にNull Safety対応していく方法

Flutter2がStableになったのでNull Safetyしたかったのですが2021/3はじめ時点ではかなり情報も少なかったため、とにかく試行錯誤で雑にNull Safety対応した記録です。

Flutterのバージョンアップ

stableチャンネルにしているのにもかかわらずなぜか flutter upgrade してもFlutter1から2に上がらなかったのと、あとは仕事のプロジェクトのバージョンは2にあげられないというのもあり、fvmというFlutterのバージョン管理ツールを使うことにしました。

https://github.com/leoafarias/fvm

これでバージョン2をインストールしました。

Null Safetyを有効にする

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"
            ]
        }
    ]
}

iOSの本番ビルド

flutter build ios だけだとエラーになるので、先程と同様のパラメータを付けます。

flutter build ios --no-sound-null-safety

これでアプリリリースまで行けました。

Androidはとりあえずデバッグまで

とりあえずこれでAndroidはデバッグ実行できるところまで確認できました。本番ビルドは未検証です。

今回は雑なやりかたのパターンですので、しっかりやる場合は他の記事なども参考にすると良いでしょう。

ツイッターでシェア
みんなに共有、忘れないようにメモ

だら@Crieit開発者

Crieitの開発者です。 Webエンジニアです(在宅)。大体10年ちょい。 記事でわかりにくいところがあればDMで質問していただくか、案件発注してください。 業務依頼、同業種の方からのコンタクトなどお気軽にご連絡ください。 業務経験有:PHP, MySQL, Laravel, Vue.js, React, Node, RoR 趣味:Elixir, Phoenix, Nuxt, Express, GCP, AWS等色々 PHPフレームワークちいたんの作者

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント