我想使用 dagger(Square 的 dagger v1)创建一个单例类,其构造函数需要上下文作为参数。然后我想将这个单例类注入到我的 MainActivity 中。定义这一点的正确步骤是什么?
我尝试这样做:
单例类:
@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 创建的其他文件(我看到其中两个在官方示例中使用):
Android模块:
@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);
}
}
对于应用程序类:
import java.lang.annotation.Retention;
import javax.inject.Qualifier;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Qualifier @Retention(RUNTIME)
public @interface ForApplication {
}