1

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

我有一个 MyRequest 类,其 ctor 有 2 个参数:

  1. ConnectivityManager 配置
  2. 整数值

我将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 >。

知道如何解决这个问题吗?

4

1 回答 1

3

与 AutoFactory示例一样,如果您的构造函数采用 a Foo,则您的 AutoFactory 生成的构造函数将采用 aProvider<Foo>代替。这样您的工厂将为每次调用请求一个新的Foo(或)一次,而不必在它们之间共享实例。ConnectivityManagerget

您可能希望FooConnectivityManager成为创建对象的所有实例的相同实例(MyRequest此处),但这是由您和 Dagger 决定的,而不是 AutoFactory。因此,AutoFactory 将始终生成采用 Provider 的代码,无论您是否以这种方式使用它们。

幸运的是,修复非常简单:Dagger 可以像注入 aProvider<ConnectivityManager>一样容易地注入 a ConnectivityManager(因为它可以用于任何绑定),所以你可以@Provides像这样改变你的方法......

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

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

于 2016-10-02T20:12:11.933 回答