😑

Flutterバージョン変更の経験談

2022/10/24に公開

背景

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システムの追加により、確実に画面遷移のコントロールはすごくやりやすくなりました。
ですが、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.builder showDialog.child
CupertinoDialog CupertinoPopupSurface & CupertinoAlertDialog
ButtonTheme.bar ButtonBarTheme
RenderView.scheduleInitialFrame 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
accentColor colorScheme.secondary
accentColorBrightness 削除
accentIconTheme 削除
accentTextTheme 削除

2.10.0

対応工数:小
範囲:小
Dart:2.16.0~

Dart言語とFlutter安定しつづあるかと思い、2.10.0までのバージョンアップは運転しやすくなったかなぁと思います。

一番やらないといけないのは、AndroidではKotlinのバージョンは1.5.31以上に指定することでした。

APIの削除関して、以下のものを完全変更になりました。(使用頻度は低いなぁ

2.10.0前 2.10.0
FloatingHeaderSnapConfiguration.vsync SliverPersistentHeaderDelegate.vsync
BlacklistingTextInputFormatter FilteringTextInputFormatter
WhitelistingTextInputFormatter FilteringTextInputFormatter

注意

DartのパッケージはDart2.0により、動けないAPIありました。

2.10.0前 2.10.0
Platform.packageRoot 動けない
Isolate.packageRoot 動けない
Platform.packageRoot 動けない

対応方法

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
FlatButton TextButton
RaisedButton ElevatedButton
OutlineButton OutlinedButton
ButtonTheme XXXButtonTheme
Scaffold.of(context).showSnackBar ScaffoldMessenger.of(context).showSnackBar
Scaffold.of(context).removeCurrentSnackBar ScaffoldMessenger.of(context).removeCurrentSnackBar
Scaffold.of(context).hideCurrentSnackBar ScaffoldMessenger.of(context).hideCurrentSnackBar
RenderEditable.onSelectionChanged TextSelectionDelegate.textEditingValue
UpdateLiveRegionEvent 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の更新内容はどんどん安定していって、今後はメインの開発ツールになるだろうと信じています。

参考資料:
Flutter主なのバージョンリリース情報
Flutter大きな変化バージョン

Discussion