Dagger2 模块:如何获取上下文以传递给我要提供的 class 的构造函数
Dagger2 module: how to obtain context to pass to the constructor of a class I want to provide
第一次使用Dagger2
在我的 android 应用程序中,我有一个扩展应用程序的 MyApplication class。
我还有一个 ImageAssistant class,它是相关图像处理方法的集合。
在我的 MyApplicaiton class 中,我曾经为所有要使用的活动实例化一个 ImageAssistant。
现在我试图让它与 Dagger2 一起工作,但我不知道如何在提供 ImageAssistant 的模块中传递上下文
我的代码是这样的:
public class ImageAssistant {
Context context;
public ImageAssistant(Context context){
this.context = context;
}
// A bunch of methods...
}
public class MyApplication extends Application {
public ImageAssistant imageAssistant;
public void onCreate() {
imageAssistant = new ImageAssistant(this);
}
}
现在,进入 Dagger 2,这就是我所拥有的
public class ImageAssistant {
Context context;
@Inject
public ImageAssistant(Context context){
this.context = context;
}
// A bunch of methods...
}
public class MyApplication extends Application {
@Inject
public ImageAssistant imageAssistant;
public void onCreate() {
}
}
在包.modules:
AppModule.java
@Module
public class AppModule {
@Provides
ImageAssistant provideImageAssistant() {
return new ImageAssistant(); // HERE A CONTEXT IS NEEDED. WHERE TO GET IT FROM?
}
}
编辑:这是我的模块现在的样子,但我仍然不知道如何将所有东西组合在一起:
@Module
public class AppModule {
private MyApplication application;
public AppModule(MyApplication application) {
this.application = application;
}
@Provides
Context provideApplicationContext() {
return this.application;
}
@Provides
ImageAssistant provideImageAssistant(ImageAssistant imageAssistant) {
return imageAssistant;
}
}
这是 AppComponent:
@Singleton
@Component(modules = {AppModule.class})
public interface AppComponent {
ImageAssistant provideImageAssistant();
Context context();
}
您的模块应如下所示:
@Module(injects = {MainActivity.class})
public class AppModule {
private MyApplication application;
public AppModule(MyApplication application) {
this.application = application;
}
@Provides
public ImageAssistant provideImageAssistant() {
return new ImageAssistantImpl(application); // implementation of ImageAssistant
}
}
在Activity
中的用法:
public class MainActivity extends Activity{
@Inject
ImageAssistant imageAssistant;
@Override
protected void onCreate(Bundle savedInstanceState) {
SharedObjectGraph.inject(this);
imageAssistant.doSomething();
}
}
不要忘记在 Application
class 中初始化 ObjectGraph
。我使用 SharedObjectGraph
static class 在整个应用程序中共享从 AppModule
创建的 ObjectGraph
。
阅读 building the graph 部分。
我做了这样的事情:
@Module
public class ApplicationModule {
private final SpendApplication app;
public ApplicationModule(SpendApplication app) {
this.app = app;
}
@Provides
@Singleton
public Context providesContext() {
return app;
}
}
和:
@Module
public class GattManagerModule {
@Provides
@Singleton
GattManager providesGattManager(Context context) {
return new GattManager(context);
}
}
并声明所有使用它的地方:
@Component(modules = { ApplicationModule.class, GattManagerModule.class, ...})
@Singleton
public interface ApplicationComponent {
void inject(MainScreenActivity activity);
...
}
在我的应用程序中 class:
@Override
public void onCreate() {
super.onCreate();
component = DaggerApplicationComponent.builder()
.applicationModule(new ApplicationModule(this))
.build();
}
在我的 MainActivity 中:
@Inject
GattManager gattManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getAppComponent().inject(this);
}
第一次使用Dagger2
在我的 android 应用程序中,我有一个扩展应用程序的 MyApplication class。 我还有一个 ImageAssistant class,它是相关图像处理方法的集合。 在我的 MyApplicaiton class 中,我曾经为所有要使用的活动实例化一个 ImageAssistant。
现在我试图让它与 Dagger2 一起工作,但我不知道如何在提供 ImageAssistant 的模块中传递上下文
我的代码是这样的:
public class ImageAssistant {
Context context;
public ImageAssistant(Context context){
this.context = context;
}
// A bunch of methods...
}
public class MyApplication extends Application {
public ImageAssistant imageAssistant;
public void onCreate() {
imageAssistant = new ImageAssistant(this);
}
}
现在,进入 Dagger 2,这就是我所拥有的
public class ImageAssistant {
Context context;
@Inject
public ImageAssistant(Context context){
this.context = context;
}
// A bunch of methods...
}
public class MyApplication extends Application {
@Inject
public ImageAssistant imageAssistant;
public void onCreate() {
}
}
在包.modules:
AppModule.java
@Module
public class AppModule {
@Provides
ImageAssistant provideImageAssistant() {
return new ImageAssistant(); // HERE A CONTEXT IS NEEDED. WHERE TO GET IT FROM?
}
}
编辑:这是我的模块现在的样子,但我仍然不知道如何将所有东西组合在一起:
@Module
public class AppModule {
private MyApplication application;
public AppModule(MyApplication application) {
this.application = application;
}
@Provides
Context provideApplicationContext() {
return this.application;
}
@Provides
ImageAssistant provideImageAssistant(ImageAssistant imageAssistant) {
return imageAssistant;
}
}
这是 AppComponent:
@Singleton
@Component(modules = {AppModule.class})
public interface AppComponent {
ImageAssistant provideImageAssistant();
Context context();
}
您的模块应如下所示:
@Module(injects = {MainActivity.class})
public class AppModule {
private MyApplication application;
public AppModule(MyApplication application) {
this.application = application;
}
@Provides
public ImageAssistant provideImageAssistant() {
return new ImageAssistantImpl(application); // implementation of ImageAssistant
}
}
在Activity
中的用法:
public class MainActivity extends Activity{
@Inject
ImageAssistant imageAssistant;
@Override
protected void onCreate(Bundle savedInstanceState) {
SharedObjectGraph.inject(this);
imageAssistant.doSomething();
}
}
不要忘记在 Application
class 中初始化 ObjectGraph
。我使用 SharedObjectGraph
static class 在整个应用程序中共享从 AppModule
创建的 ObjectGraph
。
阅读 building the graph 部分。
我做了这样的事情:
@Module
public class ApplicationModule {
private final SpendApplication app;
public ApplicationModule(SpendApplication app) {
this.app = app;
}
@Provides
@Singleton
public Context providesContext() {
return app;
}
}
和:
@Module
public class GattManagerModule {
@Provides
@Singleton
GattManager providesGattManager(Context context) {
return new GattManager(context);
}
}
并声明所有使用它的地方:
@Component(modules = { ApplicationModule.class, GattManagerModule.class, ...})
@Singleton
public interface ApplicationComponent {
void inject(MainScreenActivity activity);
...
}
在我的应用程序中 class:
@Override
public void onCreate() {
super.onCreate();
component = DaggerApplicationComponent.builder()
.applicationModule(new ApplicationModule(this))
.build();
}
在我的 MainActivity 中:
@Inject
GattManager gattManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getAppComponent().inject(this);
}