我想使用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 {
}
答案 0 :(得分:3)
您需要将@ForApplication
限定符添加到Context
构造函数中的SingletonClass
参数。
Dagger现在正在寻找Context
来注射,但只有一个@ForApplication Context
,这是不匹配的。
@Singleton
public class SingletonClass {
@Inject
SingletonClass(@ForApplication Context ctx) {
}
}
现在您还可以删除library = true
中AndroidModule
行,因为Dagger 警告您@ForApplication Context
未使用1}} em>(不要忽视这些警告!)。
此外,这可能只是一个复制粘贴错误,此SingletonClass
不应该有@Module
注释。