SharedPreferencesPluginでambiguous use of 'register(with:)'のエラー(Flutter3.7更新時・Macデスクトップ)
結論:「shared_preferences」のバージョンを2.0.15に固定する
2023/2/5 Flutter エラー・バグ日記
こちらの日記の続き、Flutter SDKを3.3.4から3.7.1にアップグレードした際に発生したエラー対応記録。
アップグレード後にMacのデスクトップアプリをビルドしたところ、以下のエラーが発生。
/Users/########/macos/Flutter/GeneratedPluginRegistrant.swift:##:## error: ambiguous use of 'register(with:)'
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
「SharedPreferencesPlugin」とあるので、使用している「shared_preferences」パッケージ(端末内への簡易なデータ保存を可能にするパッケージ)に関連して問題が発生しているらしい。
※同じエラーが「PathProviderPlugin」に対しても出ていたが、こちらの対処履歴については、下記日記に記載。
「SharedPreferencesPlugin」の重複登録が問題
こちらの日記で書いた「PathProviderPlugin」のエラーと同様に、
macos/Flutter/GeneratedPluginRegistrant.swift
の自動生成ファイル中の「RegisterGeneratedPlugins」メソッドに、
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
が重複登録されていることが問題だと思われる。
「shared_preferences」は、バージョン2.0.16で変更があった模様
「RegisterGeneratedPlugins」メソッドの上にあるimport文には、下記2つの「shared_preferences」のパッケージが指定されていた。
import shared_preferences_foundation import shared_preferences_macos
正常に動作していたときのコードには、「import shared_preferences_foundation」が無かったので、これが重複登録の原因と思われる。
下記「Changelog」を調べてみると、
「shared_preferences」は、2023年1月リリースのバージョン2.0.16で変更があり、iOSとmacOS用には、「shared_preferences_foundation」という新しい付随ライブラリが用意されたと説明がある。
これに伴い、今まであったmacOS用の「shared_preferences_macos」は廃止されたらしい(こちらのページに記載がある)。
今回のエラーに直面する前に、Flutter3.7.1へのアップグレードをする過程で、「flutter pub upgrade」をしたので、確かに「pubspec.yaml」にある「shared_preferences」のバージョンは、現時点最新の「2.0.17」(つまり「2.0.16」以降の状態)になっていた。
「^」マークを取ってバージョン固定する
「GeneratedPluginRegistrant.swift」は、ファイル内のコードを修正しても、ビルドすると元に戻ってしまうため、コメントアウトして取り除こうとしても意味がない。。
一方で、「shared_preferences」については、こちらの日記で書いた「path_provider」の対応のように、「pubspec.yaml」にmacOS用のパッケージを別途登録していた訳ではないので、「pubspec.yaml」上で重複の恐れがあるパッケージを削除できる余地もない。
重複を解消する方法が分からず、調べてみると、やや状況は異なるが、以下のQA記事が参考になりそうだった。
ここでは、パッケージの変更が行われる前のバージョン「2.0.15」に固定する方法が提案されていた。
「pubspec.yaml」にFlutterのパッケージを登録する際、「^2.0.15」のように書くことが多いが、「^」を付けると、ビルド時に自動的に最新版をインポートしてしまうらしい。
そのため、「^」を外し、以下のように修正した。
shared_preferences: 2.0.15
この状態で、Podfile.lock削除 → flutter clean → Pub get → pod install の上、ビルドしたら、「GeneratedPluginRegistrant.swift」に「SharedPreferencesPlugin.register・・・」が1つだけ登録されるようになり、エラーは解消された。
最近、設定系のデータ保存には、ローカルデータベース用のパッケージ「hive」を兼用することが多く、「shared_preferences」の更新に気づいていなかった。
古いバージョンに固定する方法はあまり気が進まないが、、恒久策は追って再検討することとし、いったん本対処法で乗り切ることとする。。
\一般的なエラー対処法をまとめた記事はこちら/
リリースしたアプリ(全てFlutterで開発)
個人アプリ開発で役立ったもの
おすすめの学習教材
\超初心者向けでオススメな元Udemyの講座/
\キャンペーン時を狙えば安価で網羅的な内容が学べる(日本語訳あり)/
\Gitの基礎について無料で学べる/
おすすめの学習書籍
\実用的。image_pickerに関してかなり助けられた/
\Dartの基礎文法を素早くインプットできる/