ぽぴなび

知って感動した技術情報・生活情報や買ってよかったものの雑記です。

【Flutter】 Flutter1.22から2.2へのアップグレードで詰まったところ&解決策

1.22から2.0系への変更は地道な作業や検索してもあまりジャストな解決策がないものが多いので、時間がたっぷり取れるときにやったほうがいい。

null-safetyへの対応

パッケージ

※具体的な進め方は調べるとたくさん記事が出てくるので割愛。

以下でも説明されているが、Flutter 2系へのアップグレードを始める前に使用しているパッケージがnull-safetyに対応しているかどうかをチェックする必要がある。

dart.dev

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

github.com

TextFieldのThemeの変更

TextFieldのカーソルの色や下線の色などは、1.22ではMaterialAppprimaryColorで指定した色になっていたが、2.0から変更になった。(デフォルトの青色が表示される?)

flutter.dev

MaterialAppprimarySwatchで色を指定するか、明示的に指定する必要がある。

[参考]他の変更点

https://flutter.dev/docs/release/breaking-changes#released-in-flutter-2