Flutterバージョン変更の経験談
背景
Flutterは2018年年末リリース以来、ものすごいスピードで広いっています。
Flutterは成長し続けている中、バージョンアップはもちろん、性能や仕組みは日々進化しています。
そんな中、大きなバージョンアップによって、開発者側には影響を及ぼすだろう。
こちらは1.xから3.xまでFlutterでDartを書いた経験ありましたが、毎回バージョンアップによる対応はドキドキ感半端ないですね。
API変更は少ないバージョンは良かった気持ちで、大きいの来た時、やぱいですね。
プロジェクトの仕組みまで影響出たこともあり、中は、頭痛いのは対応するには工数及びリリース時期を考慮することですね。
開発する時、バージョン指定してプロジェクト進むのはありました。
リリースして、運営していく中に、バージョンアップし続けていくのは一番理想かと思いますが、時間かかる場合、コストやリスク高い場合、Flutterのバージョンはどうやって切って対応してリリースしていくのは課題かと思います。
そこで、Flutterの公式情報を参考しながら、個人的の経験上、
コーディング面から、
iOSとAndroid
のFlutter開発者にバージョン対応について情報を共有したいと思います。
間違いところがありましたら、ご指摘のほどよろしくお願いします。
1.22.0
対応工数:大
範囲:大
Dart:2.9.0~
1.xのバージョンでは、1.22.0のバージョンは結構大きな変化がありました。
1.22.0は主に受けた恩恵はAndroid11とiOS14に対応したですが、
正直、1.xでここで大きなアップデートするのはびっくりしました。
1.21.7までは結構スムーズに移行しましたのにと思いました。
Navigator2.0
このNavigator2.0システムの追加により、確実に画面遷移のコントロールはすごくやりやすくなりました。
ですが、Navigator1.0で開発したサービスですので、ここで2.0来ると、本当に画面系の仕組みを全部直さないといけなくなりました。(涙拭きながら、OMGレベルですね
一言として、Navigator2.0、もしくは他のパッケージで画面遷移システムを切り替えしましょう。
多言語
1.21.7までに、flutter_i18nというライブラリーを使って、多言語対応したですが、1.22.0以後は、デフォルトのi10nがありまして、こちらの仕組みに移さないといけないでした。
本当に多半は単純作業ですが、「S.of(context).名前」で何箇所あるかよと。。。。。。
結論として、i10nのシステム最高です、取り込みましょう。
参考手順
2.0.0
対応工数:小〜大
範囲:大
Dart:2.12.0~
バージョン番号は2になったので、その変更は本当に多いですね。(ほぼ、nullOK
Nullable 型
Dart言語のバージョンアップにより、Flutter2.0.0からnullableを完全できるようになりました。
コーディングルールを変えたので、多分、ここは新しいコード言語として、プロジェクト始める方がいいかもしれない。
1.xで開発していたアプリは、ここでは決断しないといけないかもしれない、場合によって、コードの書き方を変えて、プロジェクト構造を変更するのもアリかもしれない。(工数と範囲絶大w
もちろん、1.xの書き方はそのままでも動きますが、モダンを求める人なら抵抗感あるかもしれない、どうしてものとき(iOSやAndroidの最新ツールとか)もあるかと思います。
API変更
影響低いかもしれないですが、せっかく2まで来たので、最新で定義したパーツを使った方がいいかもしれない。
2.0.0前 | 2.0.0 |
---|---|
showDialog.child | |
CupertinoPopupSurface & CupertinoAlertDialog | |
ButtonBarTheme | |
prepareInitialFrame() | |
... | ... |
参考:https://medium.com/flutter/whats-new-in-flutter-2-0-fe8e95ecc65
2.5.0
対応工数:小
範囲:大
Dart:2.14.0~
2.5.0までにはブラウザのマルチプラットフォームのサポートは盛り上がった感じしました。
エンジンのベース的な部分の変更大きいですけど、APIの変更は少ないのかなぁと個人的に思います。
また、iOSの性能も上がり(iOS8捨てたw)、スマホアプリ開発者の自分にとってはありがたい話ですね。
このバージョンで、一番嬉しいのはflutter_lints入っていることですね。
小さいの影響として、テーマを活用しているサービスだと、今後Material対応のため、ThemeDataの定義を変更した方がいいかもしれないと思います。
2.5.0前 | 2.5.0 |
---|---|
colorScheme.secondary | |
削除 | |
削除 | |
削除 |
2.10.0
対応工数:小
範囲:小
Dart:2.16.0~
Dart言語とFlutter安定しつづあるかと思い、2.10.0までのバージョンアップは運転しやすくなったかなぁと思います。
一番やらないといけないのは、AndroidではKotlinのバージョンは1.5.31以上に指定することでした。
APIの削除関して、以下のものを完全変更になりました。(使用頻度は低いなぁ
2.10.0前 | 2.10.0 |
---|---|
SliverPersistentHeaderDelegate.vsync | |
FilteringTextInputFormatter | |
FilteringTextInputFormatter |
注意
DartのパッケージはDart2.0により、動けないAPIありました。
2.10.0前 | 2.10.0 |
---|---|
動けない | |
動けない | |
動けない |
3.0.0
対応工数:小
範囲:小〜大
Dart:2.17.0~
2.x系は結構スムーズに3.0.0までアップデートできるかなぁと思います。
盛り上がれFlutter3の記事をたくさんご覧いただきありがとうございました。
今回はFlutter3を命名する理由として、個人的の推測ですが、プラットフォームの追加は一つで、新しい描画システムImpellerに移しそうとしているかと思います。
Impellerは優秀です、ゲーム描画はできるので、これを使いたい場合、厳密に言うと影響範囲は全アプリかと思います。
API
下記のは3.0.0で完全削除になったAPIです、使う時が気をづけてください。
3.0.0前 | 3.0.0 |
---|---|
TextButton | |
ElevatedButton | |
OutlinedButton | |
XXXButtonTheme | |
ScaffoldMessenger.of(context).showSnackBar | |
ScaffoldMessenger.of(context).removeCurrentSnackBar | |
ScaffoldMessenger.of(context).hideCurrentSnackBar | |
TextSelectionDelegate.textEditingValue | |
SemanticsEvent |
3.3.0
対応工数:小
範囲:小〜大
Dart:2.18.0~
今後はFlutterがImpellerを押そうとしていますね。
あんまに使っていないかもしれないAPI変更があり、RenderUnconstrainedBoxをRenderConstraintsTransformBoxに強制されていました。
最後
結論として、2.xのNullableコーディングからFlutter始めるのはいいかもしれないですね。
また、fvmでバージョン管理に加え、コードに影響の有無バージョンは確定でき、チーム作業で、分けて対応できるようになれるかと思います。
自分は2019年の9月からFlutterのお世話を受けているエンジニアです。
1.20.xからお使っており、いっぱいの穴に嵌めましたw。
それから、Flutter信者になり、長い付き合いになり、見る見るFlutterの更新内容はどんどん安定していって、今後はメインの開発ツールになるだろうと信じています。
Discussion