@Binds方法必须只有一个参数,其类型可分配给返回类型

时间:2017-10-09 22:48:46

标签: java android dagger-2 dagger

我正在迁移到新的匕首android 2.11

所有设置都基于Google蓝图:MVP-Dagger。但我遇到此错误:

  

错误:(22,57)错误:@Binds方法必须只有一个参数   其类型可分配给返回类型

这一行:

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

主持人:

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

有人知道如何解决这个问题吗?感谢。

3 个答案:

答案 0 :(得分:8)

错误消息解释了所有内容:

  

@Binds方法必须只有一个参数,其类型可分配给返回类型

您的@Binds方法的参数为MainPresenter。这不能分配给返回类型PresenterFactory<MainContract.Presenter>。换句话说,MainPresenter不是PresenterFactory<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注释的显式构造函数,并且Dagger 2可以在构造函数中提供依赖项。
  2. 写:

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

答案 1 :(得分:0)

使用@Provides代替@Binds

答案 2 :(得分:0)

我有相同的例外,但情况不同。

这个异常对我有误导作用。添加后

kapt {
 correctErrorTypes true 
} 

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帮助我发现我没有将implementation project(path: ':repository')添加到处理DI内容的build.gradle模块的app中。

希望这可以帮助其他有相同问题的人。