我在申请DI和MVP时使用Dagger 2。我在onCreate方法上注入组件,就像这样(它在Fragment上):
private MyComponent myComponent;
@Inject MyPresenter myPresenter;
@Override public void onCreate(Bundle savedInstanceState) {
myComponent().inject(this);
super.onCreate(savedInstanceState);
}
public MyComponent myComponent() {
if(myComponent == null) {
myComponent = DaggerMyComponent.builder()
.applicationComponent(((MyAppApplication) getActivity().getApplicationContext()).component())
.myModule(new MyModule())
.build();
}
return myComponent;
}
有时我调用一个方法(来自Activity,两者的生命周期都已结束,用户可以随时调用此方法[刷卡刷新])使用myPresenter,如下所示:
public void doSomething() {
if(myPresenter != null) {
myPresenter.doSomething();
} else {
//FAIL HERE!
}
}
组件:
@ActivityScope @Component(dependencies = ApplicationComponent.class,
modules = { MyModule.class })
public interface MyComponent {
void inject(MyFragment myFragment);
MyPresenter getMyPresenter();
GetMyExecutor getExecutor();
}
模块:
@Module public class MyModule {
@Provides @ActivityScope MyPresenter provideMyPresenter(MyPresenterImpl presenter) {
return presenter;
}
@Provides @ActivityScope GetMyExecutor provideGetMyExecutor(
GetMyExecutorImpl getMyExecutor) {
return getMyExecutor;
}
}
我正在使用Dagger的2.0.1版本。
任何人都知道为什么有时候是空的,有时候不是?这是一个错误?
编辑1:
如果你注意到,我在这个片段中有一个列表,当用户触发拉动刷新时,我在我的活动中调用一个方法,如:
((BaseActivity)getContext).update();
此方法调用异步任务,最后,我使用ViewPager中的适配器(我使用OgacleJapan - SmartTabLayout)获取可见的当前片段,如下所示:
Fragment fragment = adapter.getItem(viewPager.getCurrentItem());
if(fragment != null) {
if(fragment instanceof MyFragment) {
((MyFragment) fragment).doSomething();
}
if(fragment instanceof MyFragment2) {
((MyFragment2) fragment).doSomething();
}
}
我认为这个演员阵容可能是个问题。我添加了一个递归来验证视图中变量的一致性,我注意到,如果我在片段中调用这些变量,那么永远不会返回null。如果我从activity调用,则返回null。
答案 0 :(得分:1)
将adapter.getItem()替换为adapter.getPage()。这将解决问题。