我正在使用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
),您可能希望ConnectivityManager
或MyRequest
成为同一实例,但这是您和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/