我使用的是Dagger-2 (ver: 2.7)和AutoFactory (ver: 1.0-beta3 3)。我正面临一个特殊的问题。
我有一个类MyRequest,它的ctor接受两个参数:
我把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不能转换为Provider < ConnectivityManager >。
知道怎么解决这个问题吗?
发布于 2016-10-02 20:12:11
与AutoFactory 示例一样,如果构造函数采用Foo,则自动工厂生成的构造函数将采用Provider<Foo>。这样,您的工厂将为每次调用Foo (或ConnectivityManager)请求一次新的get,而不必在它们之间共享实例。
在这种情况下,您可能希望Foo或ConnectivityManager成为创建对象的所有实例(此处为MyRequest)的相同实例,但这是由您和Dagger命令,而不是AutoFactory。因此,无论您是否以这种方式使用提供程序,AutoFactory都会生成使用提供程序的代码。
幸运的是,修复非常容易: Dagger可以像注入Provider<ConnectivityManager>一样简单地注入ConnectivityManager (就像任何绑定一样),所以您可以像这样更改@Provides方法.
@Provides
@SystemScope
public final MyRequestFactory providesMyRequestFactory(
Provider<ConnectivityManager> connectivityManagerProvider {
return new MyRequestFactory(connectivityManagerProvider);
}因为生成的工厂将有一个@Provides注释,所以最好完全删除@Provides方法,让Dagger使用 MyRequestFactory injections的构造函数。虽然您将丢失来自@SystemScope方法的@Provides范围注释,但这并不是问题:使用上面的Provider<ConnectivityManager>注入,您不必担心生成工厂的生命周期,因此可以回到默认的非作用域提供。
https://stackoverflow.com/questions/39818848
复制相似问题