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

 

 

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

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

 

関数名を直したくても、パッケージの関数名なので直せない。。

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


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

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