【Flutter】 Flutter1.22から2.2へのアップグレードで詰まったところ&解決策
1.22から2.0系への変更は地道な作業や検索してもあまりジャストな解決策がないものが多いので、時間がたっぷり取れるときにやったほうがいい。
null-safetyへの対応
パッケージ
※具体的な進め方は調べるとたくさん記事が出てくるので割愛。
以下でも説明されているが、Flutter 2系へのアップグレードを始める前に使用しているパッケージがnull-safetyに対応しているかどうかをチェックする必要がある。
dart pub outdated --mode=null-safety
などで対応を確認し
すべてnull-safetyに対応しているようであればそのまま進める。
一部パッケージがnull-safetyに対応していない場合は、代替パッケージがないか探してみるか、自分で書けそうかなどを検討する。 本家のパッケージは対応していなくても、有志の方がそれをnull-safetyに対応させてパッケージ化してくれているものもあるので調べてみる価値はある。
代替パッケージもないし、自分でも書けなさそうであれば依存パッケージがnull-safetyに対応してくれるのを待つしかない。
自分のコード
地道にやってくしかない。
ビルドできない
ある程度は予想していたが、具体的には下記のようなエラーが出てビルドできなくなった。
Undefined symbols for architecture arm64: "_OBJC_CLASS_$_FlutterStandardMessageCodec", referenced from: objc-class-ref in FlutterWebView.o "_OBJC_CLASS_$_FlutterError", referenced from: objc-class-ref in FLTWKNavigationDelegate.o objc-class-ref in FlutterWebView.o "_OBJC_CLASS_$_FlutterMethodChannel", referenced from: objc-class-ref in FLTCookieManager.o objc-class-ref in FlutterWebView.o "_FlutterMethodNotImplemented", referenced from: -[FLTCookieManager handleMethodCall:result:] in FLTCookieManager.o ___83-[FLTWKNavigationDelegate webView:decidePolicyForNavigationAction:decisionHandler:]_block_invoke in FLTWKNavigationDelegate.o -[FLTWebViewController onMethodCall:result:] in FlutterWebView.o ld: symbol(s) not found for architecture arm64 clang: error: linker command failed with exit code 1 (use -v to see invocation) note: Using new build systemnote: Planning buildnote: Constructing build description
最終的な解決策
{flutter_project}/ios
ディレクトリをバックアップしてから削除、flutter create .
を実行した。
Info.plist
などの変更が失われてしまうので、バックアップしておいたファイルなどから適宜復元する必要がある。自分の場合はShareExtensionを使っていてガッツリios
プロジェクトをいじっていたのでかなりめんどくさかった。
他に試したこと
ビルドできない的なワードで調べると大体以下のような対処法が引っかかったが、以下では解決できなかった。
flutter clean && \ rm ios/Podfile ios/Podfile.lock pubspec.lock && \ rm -rf ios/Pods ios/Runner.xcworkspace && \ flutter run
TextFieldのThemeの変更
TextField
のカーソルの色や下線の色などは、1.22ではMaterialApp
のprimaryColor
で指定した色になっていたが、2.0から変更になった。(デフォルトの青色が表示される?)
MaterialApp
のprimarySwatch
で色を指定するか、明示的に指定する必要がある。
[参考]他の変更点
https://flutter.dev/docs/release/breaking-changes#released-in-flutter-2