web-dev-qa-db-ja.com

@Bindsメソッドには、戻り値の型に割り当て可能な型のパラメーターを1つだけ含める必要があります

新しい短剣に移行していますAndroid 2.11

すべてGoogleの青写真に基づいて設定されています:MVP-Dagger。しかし、このエラーが発生しています:

エラー:(22、57)エラー:@Bindsメソッドには、戻り値の型に割り当て可能な型のパラメーターを1つだけ含める必要があります

ここでこの行:

   @ActivityScoped
    @Binds abstract PresenterFactory<MainContract.Presenter> providePresenterFactory(MainPresenter presenter);

プレゼンター:

@ActivityScoped
public class MainPresenter extends BasePresenterImpl<MainContract.View>
    implements MainContract.Presenter { public MainPresenter(String s) {..
} ... }

誰かがこれを解決する方法について何か考えがありますか?ありがとう。

6
Mohamed ALOUANE

エラーメッセージはすべてを説明しています:

@Bindsメソッドには、戻り値の型に割り当て可能な型のパラメーターを1つだけ含める必要があります

@BindsメソッドのパラメーターはMainPresenterです。これは、戻り値の型PresenterFactory<MainContract.Presenter>に割り当てることはできません。つまり、MainPresenterPresenterFactory<MainContract.Presenter>のインスタンスではありません。

@Bindsメソッドの正しい構文は次のようになります。

@Binds
abstract Abstraction bindAbstration(Concretion concretion)

ここで、concretionAbstractionのインスタンスです。

または、Kotlinでは:

@Binds
abstract fun bindAbstraction(concretion: Concretion) : Abstraction

@Bindsメソッドは魔法ではありません。それらはタイプ(たとえば、インターフェース)とそのタイプの実装をバインドしますDaggerが提供する方法を知っているすでに。

更新

次の手順で、@Provides@Bindsに変換できます。

  1. MainPresenter@Injectアノテーションが付けられた明示的なコンストラクターがあり、Dagger2がコンストラクターに依存関係を提供できることを確認してください。
  2. 書く:

    @Binds
    abstract MainContract.Presenter bindPresenter(MainPresenter mainPresenter);
    
16
David Rawson

同じ例外がありましたが、状況が異なりました。

例外は私にとって誤解を招くものでした。追加後

_kapt {
 correctErrorTypes true 
} 
_

to _build.gradle_本当の問題を見つけました:

_error: [ComponentProcessor:MiscError] dagger.internal.codegen.ComponentProcessor was 
unable to process this class because not all of its dependencies could be resolved.
Check for compilation errors or a circular dependency with generated code.
_

ヒント_not all of its dependencies could be resolved_は、DI関連のものを処理するappモジュールの_build.gradle_にimplementation project(path: ':repository')を追加し忘れたことを見つけるのに役立ちました。

これが同じ問題を抱えている他の人に役立つことを願っています。

1
Fartab

@Bindsの代わりに@Providesを使用する

0
kreker