遅ればせながら、私のMacもFlutter2にアップグレードしてみました。
そのアップデート手順をまとめておこうと思います。
アップグレードの実行は、OSのターミナルからでも、Android StudioのTerminalからでも実行することができます。
Android StudioのTerminalから実行するときは、何かプロジェクトを開いて(あるいは新規プロジェクトを作成して)、Terminal画面から実行します。
Flutterのchannelを確認
Flutterの安定性を表すビルドには4つの種類があります。
その4種類を簡単に説明すると、以下のような感じ。
- master:最新。機能するはずだけど、もしかしたらバグがあるかもしれない。
- dev:テストされている最新のビルド。
- beta:毎月第一月曜日にマスターから切り離されてリリースされる、安定版の一歩手前。
- stable:四半期に一回リリースされる安定版。
「master」から「stale」に行くにつれ、安定性が高くなっているということになります。
今回Flutter2へのアップグレードは、どのchannelでも実行することができます。
まずはアップグレードの前に、今のFlutterがどのchannelになっているのかを確認しておきます。
$ flutter channel
Flutter channels:
master
dev
beta
* stable
stableの先頭に*マークがついているので、今のFlutterはstableであることが確認できます。
下記のように、バージョン番号の確認コマンドでもビルド情報を見ることができます。
$ flutter --version
安定版のstableを使うのが一般的なので、もしchannelがstableでない場合は、下記のコマンドでstableにしておくのがいいかなと思います。
$ flutter channel stable
channelって何?:詳しくはこちら↓
アップグレードの実行
channelを確認したら、Flutterをアップグレードします。
$ flutter upgrade
この1行で、SDKがダウンロードされアップグレードが実行されます。
数分から、回線状況によってはそれ以上時間がかかります。
アップグレードが終わったところで次のように表示され、Flutterが2.0.6、Dartが2.12.3になったことがわかります。
Flutter 2.0.6 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 1d9032c7e1 (6 days ago) • 2021-04-29 17:37:58 -0700
Engine • revision 05e680e202
Tools • Dart 2.12.3
アップグレード後、自動的にflutter doctorも実行されるのでしばし待ちます。
最後に 「●No issues found!」と表示され、「Welcome to Flutter!」の囲み表示が出たら無事成功です。
ダウングレードしたいとき
アップグレードしたけど、やっぱりダウングレードしたい! というときはdowngradeコマンドを使うと、バージョンを戻すことができます。
$ flutter downgrade
Downgrade flutter to version 1.22.6
? [y|n]: y
Success
実行すると、戻すバージョンを聞かれるので[y]で実行します。
Successと出たらダウングレード完了です。
Flutterのアップグレード後にやること
Flutterのシステム自体のアップグレードは、flutter upgradeコマンドの実行で完了です。
でもFlutter2へのアップグレード方法の記事をググると、既存プロジェクトのFlutter2へのnull-safety対応の作業コマンドも続けて実行していたりして、初心者はちょっと混乱してしまいます。
そこで、Flutterのアップグレードって色々やることあるの? というモヤモヤした疑問を解決したいと思います。
ここでは実際に細かな作業はしていませんし、解説も途中までですが、「Flutter2に対応させる、ってそういうことなのね」ってことが理解できるかなと思います。
既存プロジェクトのFlutter2 null-safety対応の手順概略
flutter upgradeコマンドでFlutter2にアップグレードしたら、その後にやることが色々あるのかといえば、実は必ずしもそういうことではありません。
これから新規プロジェクトを作るときは、Flutter2の環境で作って行くわけですから、Flutter2の仕様に則って作成すれば良いだけです。
巷で「Flutter2対応の作業がスッゲー大変」と言うコトバが聞かれるのは、「既存のプロジェクトをFlutter2(のnull-safetyなど)に対応させる作業が大変だ」ということです。
具体的な作業は、
- 使っているパッケージが、Flutterのどのバージョンに対応しているのかを調べる。
- pubspec.yamlに書いてあるパッケージのバージョンを、null-safetyに対応しているバージョン番号に書き換え。
- Dartコードをnull-safetyの強制適用に対応するよう修正する。
というような流れです。
null-safetyについては、こちら
でちょっと解説しています。このFlutter2対応作業の中で一番大変なのは、上記手順の3番「Dartコードの修正」です。
具体的には、エディタを開いて、エラーを示す赤いニョロニョロ下線のコードを修正して行くわけです。
でも、その作業を全て手作業でやるんかい!? と言ったら、そういうことではありません。(もちろん手作業もいっぱいあるけど…)
1番の「パッケージの対応バージョンを調べる」と、2番の「パッケージで使っているバージョン番号を書き換える」という作業は、実行コマンドが用意されているし、Dartのコード修正もこのコマンドの実行でちょっとやってくれます。
使うコマンドは、Android Studioでpubspec.yamlファイルを開いたときに、画面の上部にも表示されている「Pub outdated」と「Pub upgrade」です。
じゃ具体的に「Pub outdated」と「Pub upgrade」コマンドは、どんな風に動くのか、やってみます。
まずpub outdatedで、使っているパッケージのバージョン番号を調べます。
pubspec.yamlファイルの右上の青文字「Pub outdated」をポチるか、またはターミナルで実行するなら、次のコマンドです。
$ dart pub outdated
もしくは、これ↓
$ flutter pub outdated
でも、上のpub outdatedコマンドだけでは、パッケージのnull-safety対応状況がわからないので、下のようなオプションをつけてターミナルから実行してみます。
$ dart pub outdated --mode=null-safety
もしくは、これ↓
$ flutter pub outdated --mode=null-safety
このオプションは、パッケージ単体での対応状況でなはくて、パッケージ間の依存関係も含めたnull-safety対応状況を調べられる、という優れものです。
このコマンドでは対応状況を調べるだけなので、pubspec.yamlもDartファイルも書き変わることはありません。
実行結果には、下のような一覧が表示されます。
実際にはこの他にも、システムからのメッセージが何行か表示されます。
画面左の「Package Name」の列の右に、「Current」「Upgradable」「Resolvable」「Latest」と並んでいます。
ここで大切なのは、右から2番目の「Resolvable」の列です。
ここに「✓」がついているバージョンなら、null-safetyの対応OK。
「✗」なら未対応なので、そのパッケージが対応してくれるまで待つ他はありません。
このコマンドで、そのプロジェクトのパッケージがnull-safety対応できるバージョンの準備ができていることがわかったら、次のコマンドで実際にパッケージのアップグレード作業に入っていきます。
次のコマンドを実行すると、pubspec.yamlに書いてあるパッケージのバージョン番号などが自動で書き換わります。
ただこのコマンドでは、ある特定のパッケージのみをアップグレードするというこができません。
使っているパッケージ全てがアップグレードされるので注意が必要です。
$ dart pub upgrade --null-safety
もしくは、これ↓
$ flutter pub upgrade --null-safety
pub upgradeコマンドは、pubspec.yamlファイルの右肩の青文字「Pub upgrade」から実行するのと、ターミナルから実行するのとでは、動きが違うようです。
pubspec.yaml右肩の「Pub upgrade」から実行するのは、バグがあるという噂も聞いたので、ターミナルから実行する方が安全のようです。
このあとも、null-safety対応の作業はまだ続きますが、とりあえずこんな感じで作業が進みます。
アップグレードの実行前には、バックアップを取っておくことを強くお勧めします。
いまさら、ワタシなんかが、ここでいうことじゃありませんが…。念のため。
詳しくは、Dart公式サイトの解説を見てみてください。
null-safetyへの移行作業: