Flutter3.7アップグレード後の不具合対応
- 結論:flutter pub upgrade --major-versionsでパッケージを最新に更新する、など
- ①メニューバー関連で「The name 'MenuItem' isn't a type」のエラー
- ②「The method 'ForwardingFile.createSync' has fewer named arguments」のエラー
- ③moorの自動生成コードにエラーが発生
- ④「Error output from CocoaPods: Ignoring ffi-1.15.3 because its extensions are not built.」のエラー
- ⑤「Member not found: 'FirebaseAppPlatform.verifyExtends'.」のエラー
- ⑥「PathProviderPlugin」と「SharedPreferencesPlugin」で「ambiguous use of 'register(with:)'」のエラー
結論:flutter pub upgrade --major-versionsでパッケージを最新に更新する、など
2023/2/3 Flutter エラー・バグ日記
Flutter SDKを3.3.4から3.7.1にアップグレード後、運用中のMacデスクトップ用アプリをビルドしたら、山のようなエラーが発生し、対処に苦労したので、その過程を記録。
後で分かったが、アップグレード後に、AndroidやiOSでビルドした時にも、一部同様のエラーが発生するため、Macデスクトップに限らず、参考になる部分あり。
①メニューバー関連で「The name 'MenuItem' isn't a type」のエラー
最初に以下のエラーが出た。
error: The name 'MenuItem' isn't a type, so it can't be used as a type argument. (non_type_as_type_argument at [####] lib/####/####.dart:##)
デスクトップアプリのメニューバーを表示するために、以下のプラグイン
を導入していたが、そのプラグイン経由で使用していた「MenuItem」というクラス(メニュー項目を設定するクラス)に問題が生じたらしい。
導入していたバージョンの下記説明
を見たところ、
「新しいフレームワークのクラス名との衝突を避けるために、MenuItem を NativeMenuItem に名前変更します」
との記載があった。
どうやら、Flutterのバージョンを上げたことで、名前衝突の問題が顕在化したらしい。
コード中の「MenuItem」をすべて「NativeMenuItem」に変更したところ、このエラーは解消された。
②「The method 'ForwardingFile.createSync' has fewer named arguments」のエラー
続いて以下のエラーが出た。
../../../.pub-cache/hosted/pub.dev/file-6.1.2/lib/src/forwarding/forwarding_file.dart:22:8: Error: The method 'ForwardingFile.createSync' has fewer named arguments than those of overridden method 'File.createSync'.
void createSync({bool recursive = false}) =>
^
org-dartlang-sdk:///third_party/dart/sdk/lib/io/file.dart:248:8: Context: This is the overridden method ('createSync').
void createSync({bool recursive = false, bool exclusive = false});
^
「ForwardingFile.createSync」というメソッドの引数が不足している、とのことだが、そもそもこのメソッドを使用している認識がなく、検討がつかない。。
お決まりの不具合解消法である
Podfile.lock削除(macosフォルダ内にあるファイルを削除)
→ flutter clean(プロジェクトフォルダ内で実行)
→ Pub get(Android Studioのボタンを押す)
→ pod install --repoupdate(macosフォルダ内で実行)
を実行してみるも、状況は変わらず。。
調べると、全く同じエラーに関する以下のQA記事があった。
どうやらDartのライブラリが古いことが原因の模様。
dart pub upgrade
で解消できるとのこと。確かにやってみると、このエラーは解消された。
※ただ、この後、Flutter関連のパッケージが古いことによるエラーも発生したので、本当はこの時点で、「flutter pub upgrade」にしておけば良かったと思われる。
③moorの自動生成コードにエラーが発生
「dart pub upgrade」をした結果、使用しているローカルDBのパッケージ「moor」の自動生成コード(自分の場合は「database.g.dart」というファイル)にエラーが発生した。
「moor」は、現在「drift」というパッケージに置き換わっており、「Pub get」でパッケージ取得処理をすると、以下のように表示され、自動的に「drift」が読み込まれるようになっていた。
moor 4.6.1+1 (discontinued replaced by drift) moor_generator 4.6.0+1 (discontinued replaced by drift_dev)
恐らく「drift」に更新されたことで、コード生成をやり直す必要があるのだろうと考え、
flutter packages pub run build_runner build --delete-conflicting-outputs
で再生成したところ、エラーは解消された。
再生成された「database.g.dart」を確認すると、主に以下3点が修正されていた。
- 「GeneratedDatabase」型の「_db」という変数名が、「attachedDatabase」に変更
- 「typeName: 'INTEGER'」という引数指定方法が、「type: const IntType()」に変更(bool型の場合は「type: const BoolType()」に変更)
- 「typeName: 'TEXT'」という引数指定方法が、「type: const StringType()」に変更
④「Error output from CocoaPods: Ignoring ffi-1.15.3 because its extensions are not built.」のエラー
ビルドすると、今度は以下のエラーが発生。
Error output from CocoaPods:
↳
Ignoring ffi-1.15.3 because its extensions are not built. Try: gem pristine ffi --version 1.15.3
Error: CocoaPods's specs repository is too out-of-date to satisfy dependencies.
To update the CocoaPods specs, run:
pod repo update
Exception: Error running pod install
メッセージの指示どおり、
sudo gem pristine ffi --version 1.15.3
を実行してみる。
※下記記事を参考にさせていただき、「sudo」をつけて実行(つけないと自分の場合は権限エラーになった)。
続けて、メッセージに書かれている「pod repo update」を実行すると、以下のメッセージが出た。
CocoaPods 1.11.3 is available.
To update use: sudo gem install cocoapods
素直に「sudo gem install cocoapods」で「cocoapods」をアップデートし、Podfile.lock削除 → flutter clean → Pub get → pod installを実行。
これで「Ignoring ffi-1.15.3・・・」のエラーは解消された模様。
⑤「Member not found: 'FirebaseAppPlatform.verifyExtends'.」のエラー
ビルドすると、今度は以下のエラーが出た(エラーが終わらない。。)。
../../../.pub-cache/hosted/pub.dev/firebase_core-1.24.0/lib/src/firebase_app.dart:18:25: Error: Member not found: 'FirebaseAppPlatform.verifyExtends'.
FirebaseAppPlatform.verifyExtends(_delegate);
^^^^^^^^^^^^^
調べると以下のQA記事があった。
様々な回答がされているが、つまるところ、2022年10月にあったfirebaseの破壊的変更の影響らしく、「firebase_core_platform_interface」というパッケージ(「firebase_core」をインポートすると裏側で一緒に導入されるパッケージ)を、「dependency_overrides」の方法を使って、バージョン4.5.1に固定する方法が提案されていた。
ただ、現在は10月からしばらく時間が経っていることもあり、バージョン固定することに違和感もあったので、試しに固定せずに、下記コマンドで「firebase_core」を含む全てのパッケージを最新に更新してみた。
flutter pub upgrade --major-versions
改めて、Podfile.lock削除 → flutter clean → Pub get → pod installを実行の上、ビルドすると、「Member not found・・・」のエラーは発生しなくなった。
※恐らく、前述②のところで最初から「flutter pub upgrade」にしておけば、このエラーは発生しなかったと思われる。
⑥「PathProviderPlugin」と「SharedPreferencesPlugin」で「ambiguous use of 'register(with:)'」のエラー
「Member not found・・・」のエラーは消えたが、今度は下記2つのエラーが発生した(本当にエラーが終わらない、、)。
/Users/########/macos/Flutter/GeneratedPluginRegistrant.swift:##:##: error: ambiguous use of 'register(with:)'
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
/Users/########/macos/Flutter/GeneratedPluginRegistrant.swift:##:## error: ambiguous use of 'register(with:)'
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
本エラーの対処履歴については、長くなるので、下記日記に分けて整理。
この2つのエラーを解消後、やっとのことで正常にビルドできるようになった。。
いつもFlutter SDKのアップグレード対応では多少の苦労があるが、今回はデスクトップアプリだったこともあり、結構大変だった。。
\一般的なエラー対処法をまとめた記事はこちら/
リリースしたアプリ(全てFlutterで開発)
個人アプリ開発で役立ったもの
おすすめの学習教材
\超初心者向けでオススメな元Udemyの講座/
\キャンペーン時を狙えば安価で網羅的な内容が学べる(日本語訳あり)/
\Gitの基礎について無料で学べる/
おすすめの学習書籍
\実用的。image_pickerに関してかなり助けられた/
\Dartの基礎文法を素早くインプットできる/