我正在使用Dagger-2(版本:2.7)和AutoFactory(版本:1.0-beta3)。
我正面临一个特殊的问题。

我有一个类MyRequest的类,其ctor带有2个参数,分别是:


ConnectivityManager配置
int somevalue


我创建了ctor为

@Autofactory
public MyRequest(@Provider ConnectivityManager conmgr, int somevalue){
//
}


我有一个包含以下内容的模块

@Provides
@SystemScope
public final ConnectivityManager provideConnectivityManager(App app) {
return (ConnectivityManager)
app.getSystemService(Context.CONNECTIVITY_SERVICE);
}


在同一模块中,执行以下操作

@Provides
@SystemScope
public final MyRequestFactory providesMyRequestFactory(ConnectivityManager connectivityManager {
    return new MyRequestFactory(connectivityManager);
}


我收到构建错误
     不兼容的类型:ConnectivityManager无法转换为提供程序。

知道如何解决吗?

最佳答案

与AutoFactory example中一样,如果构造函数采用Foo,则AutoFactory生成的构造函数将采用Provider<Foo>。这样,您的工厂将为每次对Foo的调用请求一次新的ConnectivityManager(或get),而不必在它们之间共享实例。

对于所创建对象的所有实例(此处为Foo),您可能希望ConnectivityManagerMyRequest成为同一实例,但这是您和Dagger所指定的,而不是AutoFactory。因此,无论您是否以这种方式使用AutoFactory,AutoFactory都会始终生成采用提供程序的代码。

幸运的是,修复非常容易:Dagger可以像注入Provider<ConnectivityManager>一样容易地注入ConnectivityManager(对于任何绑定都可以),因此您可以像这样更改@Provides方法...

@Provides
@SystemScope
public final MyRequestFactory providesMyRequestFactory(
        Provider<ConnectivityManager> connectivityManagerProvider {
    return new MyRequestFactory(connectivityManagerProvider);
}


...但是由于生成的工厂将带有@Inject批注,因此最好完全删除@Provides方法,并让Dagger使用该构造函数进行MyRequestFactory注入。尽管您会从@SystemScope方法中丢失@Provides范围注释,但这没问题:使用上述Provider<ConnectivityManager>注入,您不必担心所生成工厂的生命周期,因此可以回退到默认的无范围规定。

关于android - 在使用Dagger-2和Autofactory时实现辅助注入(inject)的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39818848/

10-09 19:39