PathProviderPluginでambiguous use of 'register(with:)'のエラー(Flutter3.7更新時・Macデスクトップ)
結論:「path_provider_macos」の使用をやめ、通常の「path_provider」のメソッド使用に切り替える
2023/2/4 Flutter エラー・バグ日記
こちらの日記に続き、Flutter SDKを3.3.4から3.7.1にアップグレードした際に発生したエラー対応記録。
アップグレード後にMacのデスクトップアプリをビルドしたところ、以下のエラーが発生。
/Users/########/macos/Flutter/GeneratedPluginRegistrant.swift:##:##: error: ambiguous use of 'register(with:)'
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
「PathProviderPlugin」とあるので、使用している「path_provider」パッケージに関連して問題が発生しているらしい。
※同じエラーが「SharedPreferencesPlugin」に対しても出ていたが、こちらの対処履歴については、下記日記に記載。
関数名を直したくても、パッケージの関数名なので直せない。。
調べると、FlutterではなくSwiftに関してではあるが、下記記事が見つかった。
要は、関数名が重複している(「ambiguous use」=「あいまいな使用」)せいなので、関数名を修正すれば良い模様。
しかし、「PathProviderPlugin」は外部パッケージなので、自分では名称を修正できない。。
同じパッケージ名が重複して登録されていた
エラーメッセージに、
/Users/########/macos/Flutter/GeneratedPluginRegistrant.swift:
という記載があったため、このパスのファイル(GeneratedPluginRegistrant.swift)を確認してみた。
すると、下図のように、「RegisterGeneratedPlugins」というメソッドに、
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
が重複して登録されていた。この状態が問題らしい。
※「SharedPreferencesPlugin」についても同様に重複登録されているが、これについてはこちらの日記にて記載。
そもそも「GeneratedPluginRegistrant.swift」が何なのか知りたかったが、Flutterの公式説明や他のネット記事を探してみるも、情報が見つからない。。
内容を見るに、どうやらFlutter用のプラグイン(パッケージ)と、Macデスクトップのネイティブのコードとを結びつけるための設定ファイルっぽい。
ファイルの先頭には、
// // Generated file. Do not edit. //
と書かれており、自動生成ファイルであり、編集不可となっている。
試しに、重複記載されている「PathProviderPlugin.register・・」の片方をコメントアウトしてみるも、ビルドすると自動的に元の重複状態に書き換えられてしまい、エラーは解消しなかった。。
「path_provider_macos」を直接導入していたのが問題だった
この「RegisterGeneratedPlugins」メソッドの上を見ると、複数のimport文があり、「path_provider」について下記2つのパッケージが指定されていた。
import path_provider_foundation import path_provider_macos
過去、正常に動作していたときのコードには、「import path_provider_foundation」が無かったので、どうやら、この2つのパッケージをimportすることで、同じ「PathProviderPlugin.register・・・」が登録されてしまうらしい。
Macのデスクトップアプリを作った際、通常の「path_provider」パッケージをimportしただけでは、Mac内のパス取得がエラーになってできなかった(デスクトップ用に「getApplicationSupportDirectory」や「getDownloadsDirectory」メソッドを使おうとするとエラーになった)。
そのため、別途「path_provider_macos」をimportし、直接同パッケージ内のクラス(「PathProviderMacOS」クラス)にアクセスして、対処していた。
※この点の経緯については、下記日記を参照
しかし、こちらの「path_provider_macos」の公式説明を見ると、
DISCONTINUED replaced by: path_provider_foundation
と記載されており、本パッケージは廃止されて「path_provider_foundation」に継承された模様。
「path_provider」の公式説明にある下記「Changelog」
を見ると、確かに、バージョン2.0.12で、iOS・macOS用に「path_provider_foundation」へ切り替えが行われたと書かれている。
これにより、Macデスクトップ用に特別な対応は不要になった模様。
そのため、
- 「pubspec.yaml」から、「path_provider_macos」を削除し、
- Macデスクトップ用のパス取得部分のコードを、全て通常の「path_provider」のメソッド(「getApplicationSupportDirectory」や「getDownloadsDirectory」)を使う形に修正した。
この状態で、Podfile.lock削除 → flutter clean → Pub get → pod install の上、ビルドしたら、「GeneratedPluginRegistrant.swift」に「PathProviderPlugin.register・・・」が1つだけ登録されるようになり、エラーは解消された。
Macデスクトップで「path_provider」を普通に使えるようになったのは良いことだが、過去に苦労して使える状態にしていただけに、かえって修正が大変だった。。
\一般的なエラー対処法をまとめた記事はこちら/
リリースしたアプリ(全てFlutterで開発)
個人アプリ開発で役立ったもの
おすすめの学習教材
\超初心者向けでオススメな元Udemyの講座/
\キャンペーン時を狙えば安価で網羅的な内容が学べる(日本語訳あり)/
\Gitの基礎について無料で学べる/
おすすめの学習書籍
\実用的。image_pickerに関してかなり助けられた/
\Dartの基礎文法を素早くインプットできる/