Dagger:定义可在其构造函数中获取上下文的可注入类的正确方法

时间:2014-12-07 12:30:34

标签: android dagger

我想使用dagger(Square的dagger v1)来创建一个单例类,其构造函数需要上下文作为参数。然后我想将这个单例类注入到我的MainActivity中。定义这个的正确步骤是什么?

我试过这样做:

SingletonClass:

@Module(
    injects = {MainActivity.class}
)
@Singleton
public class SingletonClass {
...

@Inject
SingletonClass(Context ctx) {}
}

我收到错误:

no injectable members on android.content.Context

据我所知,SingletonClass应该从某个地方接收它的上下文以便注射,但是因为我没有"调用"它不再是传统意义上的,而是我在类级别的MainActivity中注入它:

@Inject SingletonClass singletonClass;

我应该如何传递上下文?

以下是我为dagger创建的其他文件(我在官方示例中看到过两个):

AndroidModule:

@Module(library = true, injects = MainActivity.class)
public class AndroidModule {

private final Context context;

public AndroidModule(Context context) {
    this.context = context;
}

/**
 * Allow the application context to be injected but require that it be
 * annotated with to explicitly
 * differentiate it from an activity context.
 */
@Provides
@Singleton
@ForApplication
Context provideApplicationContext() {
    return context;
}


}

App.class(扩展我的应用程序):

public class App extends Application {
private static final String TAG = App.class.getSimpleName();
private static App instance;
public MainActivity mainActivity;
private static Context context;
private ObjectGraph objectGraph;

public void onCreate() {
    super.onCreate();

    instance = this;
    context = getApplicationContext();

    objectGraph = ObjectGraph.create(getModules().toArray());
}

public static App getInstance() {
    return instance;
}

public static Context getContext() { return context; }

protected List<Object> getModules() {
    return Arrays.asList(new AndroidModule(this), new App());
}

public void inject(Object object) {
    objectGraph.inject(object);
}
}

ForApplication类:

import java.lang.annotation.Retention;
    import javax.inject.Qualifier;

    import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Qualifier @Retention(RUNTIME)
public @interface ForApplication {
}

1 个答案:

答案 0 :(得分:3)

您需要将@ForApplication限定符添加到Context构造函数中的SingletonClass参数。

Dagger现在正在寻找Context来注射,但只有一个@ForApplication Context,这是不匹配的。

@Singleton
public class SingletonClass {

    @Inject
    SingletonClass(@ForApplication Context ctx) {
    }

}

现在您还可以删除library = trueAndroidModule行,因为Dagger 警告您@ForApplication Context未使用(不要忽视这些警告!)。

此外,这可能只是一个复制粘贴错误,此SingletonClass不应该有@Module注释。