Dagger 2 注入返回 null
Dagger 2 injection returning null
这是我的申请文件
private AppComponent component;
@Override
public void onCreate() {
super.onCreate();
setupGraph();
}
private void setupGraph() {
component = DaggerAppComponent.builder()
.appModule(new AppModule(this))
.build();
component.inject(this);
}
public AppComponent component() {
return component;
}
应用组件:
@Singleton
@Component(
modules = {
AppModule.class
}
)
public interface AppComponent {
void inject(BaseActivity activity);
void inject(BaseFragment fragment);
}
Activity模块:
@Module public final class ActivityModule {
private final Activity activity;
public ActivityModule(Activity activity) {
this.activity = activity;
}
@Provides @ActivityContext
public Context provideActivityContext() {
return activity;
}
/**
* Expose the activity to dependents in the graph.
*/
@Provides @PerActivity
Activity activity() {
return this.activity;
}
@Provides @GetFragmentManager
public FragmentManager provideFragmentManager() {
return ((BaseActivity)activity).getSupportFragmentManager();
}
Activity 分量:
@PerActivity
@Component(dependencies = AppComponent.class, modules = {ActivityModule.class, PresenterModule.class})
public interface ActivityComponent {
//Exposed to sub-graphs.
Activity activity();
}
我正在像这样在我的 BaseActivity 中注射
((MyApplication) getApplication()).component().inject(this)
不确定此注入是否正确,但我没有遇到任何编译错误。
现在,当我尝试访问片段中的演示者时出现问题,因为它为空。我正在按如下方式定义我的演示器模块
演示模块:
1. 第一次尝试
@Module
public class PresenterModule {
@Provides @PerActivity
public Presenter accessPresenter(MyPresenter presenter){
return presenter;
}
}
第二次尝试
@模块
public class PresenterModule {
@Provides @PerActivity
public Presenter accessPresenter(){
return new MyPresenter();
}
}
在我的片段中我正在做
@Inject MyPresenter presenter;
在我的 onViewCreated 上,我试图将视图设置为
presenter.setView(this); // This is null
MyPresenter 与此类似 EffectiveAndroidUI 唯一不同的是我的构造函数中没有任何内容。
您需要像界面一样引用演示者:
@ActivityScope @Component(dependencies = ApplicationComponent.class,
modules = { GenreModule.class })
public interface GenreFragmentComponent {
void inject(GenreFragment genreFragment);
GenrePresenter getPresenter(); // Like this
}
听起来你没有注入你的片段。当你用@Inject
注释一个成员时,你还必须调用yourObjectGraph.inject(this)
,其中注入方法的签名如下:
void inject(YourFragmentClass fragment);
您有两种选择可以让演示者看到您的片段。将上面的这个方法添加到您的应用程序组件,并在您的 onCreate() 函数中调用它。或者在创建片段时将片段传递给演示者。
例如:
YourFragmentClass newInstance(Bundle savedInstance, YourPresenter presenter) {
...
}
在我的例子中,我将 class 注入了一个片段而不是它的演示者,然后更正了它。
这是我的申请文件
private AppComponent component;
@Override
public void onCreate() {
super.onCreate();
setupGraph();
}
private void setupGraph() {
component = DaggerAppComponent.builder()
.appModule(new AppModule(this))
.build();
component.inject(this);
}
public AppComponent component() {
return component;
}
应用组件:
@Singleton
@Component(
modules = {
AppModule.class
}
)
public interface AppComponent {
void inject(BaseActivity activity);
void inject(BaseFragment fragment);
}
Activity模块:
@Module public final class ActivityModule {
private final Activity activity;
public ActivityModule(Activity activity) {
this.activity = activity;
}
@Provides @ActivityContext
public Context provideActivityContext() {
return activity;
}
/**
* Expose the activity to dependents in the graph.
*/
@Provides @PerActivity
Activity activity() {
return this.activity;
}
@Provides @GetFragmentManager
public FragmentManager provideFragmentManager() {
return ((BaseActivity)activity).getSupportFragmentManager();
}
Activity 分量:
@PerActivity
@Component(dependencies = AppComponent.class, modules = {ActivityModule.class, PresenterModule.class})
public interface ActivityComponent {
//Exposed to sub-graphs.
Activity activity();
}
我正在像这样在我的 BaseActivity 中注射
((MyApplication) getApplication()).component().inject(this)
不确定此注入是否正确,但我没有遇到任何编译错误。
现在,当我尝试访问片段中的演示者时出现问题,因为它为空。我正在按如下方式定义我的演示器模块
演示模块: 1. 第一次尝试
@Module
public class PresenterModule {
@Provides @PerActivity
public Presenter accessPresenter(MyPresenter presenter){
return presenter;
}
}
第二次尝试
@模块 public class PresenterModule {
@Provides @PerActivity public Presenter accessPresenter(){ return new MyPresenter(); }
}
在我的片段中我正在做
@Inject MyPresenter presenter;
在我的 onViewCreated 上,我试图将视图设置为
presenter.setView(this); // This is null
MyPresenter 与此类似 EffectiveAndroidUI 唯一不同的是我的构造函数中没有任何内容。
您需要像界面一样引用演示者:
@ActivityScope @Component(dependencies = ApplicationComponent.class,
modules = { GenreModule.class })
public interface GenreFragmentComponent {
void inject(GenreFragment genreFragment);
GenrePresenter getPresenter(); // Like this
}
听起来你没有注入你的片段。当你用@Inject
注释一个成员时,你还必须调用yourObjectGraph.inject(this)
,其中注入方法的签名如下:
void inject(YourFragmentClass fragment);
您有两种选择可以让演示者看到您的片段。将上面的这个方法添加到您的应用程序组件,并在您的 onCreate() 函数中调用它。或者在创建片段时将片段传递给演示者。 例如:
YourFragmentClass newInstance(Bundle savedInstance, YourPresenter presenter) {
...
}
在我的例子中,我将 class 注入了一个片段而不是它的演示者,然后更正了它。