Presenter有时会返回null

时间:2015-09-17 17:06:06

标签: android mvp dagger-2

我在申请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。

1 个答案:

答案 0 :(得分:1)

将adapter.getItem()替换为adapter.getPage()。这将解决问题。