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」に対しても出ていたが、こちらの対処履歴については、下記日記に記載。

 

 

本記事はライトな日記思考で書いているので、詳細説明はしておらず、基本、テキストのみで画像とかはあまり載せておりません。。m(_ _)m

解説記事ではないため、解決していない内容や、その時々の間違った解釈を述べてしまっている可能性が大いにありますので、何卒、ご了承ください。

 

「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の基礎文法を素早くインプットできる/


Dart入門 - Dartの要点をつかむためのクイックツアー

タイトルとURLをコピーしました