Android Dagger如何在View组件中进行DI
Android Dagger how to perform DI in View components
我正在使用 Dagger,到目前为止还不错。我有一个模块用于所有视图(活动和片段),我通过对象图注入它们。现在我想包含自定义视图,我的模块看起来像这样
@Module(
injects = {
//Activity
MainActivity.class,
//Fragments
LookupSearchResultsFragment.class,
// Views
MainSearchComponent.class
},
//includes = {
// PersistenceModule.class
//},
library = true,
complete = false,
addsTo = AndroidModule.class)
在我的 MainSearchComponent 中,我应该如何注入 Object Graph?我目前正在这样做:
ObjectGraph.create((BaseActivity)getContext()).inject(this);
但是我得到了这个错误。 Caused by: java.lang.IllegalStateException: Module adapter for class ...MainActivity could not be loaded. Please ensure that code generation was run for this module.
好的,所以我找到了解决方案。我需要在指定组件的位置注入模块。所以对我来说,我不得不写下面的而不是
ObjectGraph.create((BaseActivity)getContext()).inject(this);
这成功了。
ObjectGraph.create(new AcitivityModule()).inject(this);
首先,您应该将 @Module
注释的 classes 传递给 ObjectGraph.create()
,而不是 Activity
classes。其次,您不应该每次需要 inject()
时都创建图形。
通常的做法是将 objectGraph
设为您的 Application
class 的字段。这就是你能得到的:
// Application class
objectGraph = ObjectGraph.create(new AndroidModule());
然后在你的 Activity
的 onCreate()
:
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyApp app = (MyApp) getApplication();
activityGraph = app.getObjectGraph().plus(new ActivityModule());
activityGraph.inject(this); // inject with respect of activity-specific components
}
并且不要忘记清除对本地图的强引用以尽快对其进行 GC:
@Override public void onDestroy() {
activityGraph = null;
super.onDestroy();
}
我正在使用 Dagger,到目前为止还不错。我有一个模块用于所有视图(活动和片段),我通过对象图注入它们。现在我想包含自定义视图,我的模块看起来像这样
@Module(
injects = {
//Activity
MainActivity.class,
//Fragments
LookupSearchResultsFragment.class,
// Views
MainSearchComponent.class
},
//includes = {
// PersistenceModule.class
//},
library = true,
complete = false,
addsTo = AndroidModule.class)
在我的 MainSearchComponent 中,我应该如何注入 Object Graph?我目前正在这样做:
ObjectGraph.create((BaseActivity)getContext()).inject(this);
但是我得到了这个错误。 Caused by: java.lang.IllegalStateException: Module adapter for class ...MainActivity could not be loaded. Please ensure that code generation was run for this module.
好的,所以我找到了解决方案。我需要在指定组件的位置注入模块。所以对我来说,我不得不写下面的而不是
ObjectGraph.create((BaseActivity)getContext()).inject(this);
这成功了。
ObjectGraph.create(new AcitivityModule()).inject(this);
首先,您应该将 @Module
注释的 classes 传递给 ObjectGraph.create()
,而不是 Activity
classes。其次,您不应该每次需要 inject()
时都创建图形。
通常的做法是将 objectGraph
设为您的 Application
class 的字段。这就是你能得到的:
// Application class
objectGraph = ObjectGraph.create(new AndroidModule());
然后在你的 Activity
的 onCreate()
:
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyApp app = (MyApp) getApplication();
activityGraph = app.getObjectGraph().plus(new ActivityModule());
activityGraph.inject(this); // inject with respect of activity-specific components
}
并且不要忘记清除对本地图的强引用以尽快对其进行 GC:
@Override public void onDestroy() {
activityGraph = null;
super.onDestroy();
}