演示者有时 returns null

Presenter sometimes returns null

我在 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;
}

有时我会调用一个使用myPresenter的方法(从Activity开始,两者的生命周期都结束了,用户可以随时调用这个方法[滑动刷新]),就像这样:

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 版。

有人知道为什么有时为 null 有时不是吗?这是一个错误?

编辑 1:

如果你注意到了,我在这个片段中有一个列表,当用户触发拉取刷新时,我会在我的 activity 中调用一个方法,比如:

((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();
      }
    }

我认为这个演员可能是问题所在。我添加了一个递归性来验证视图内变量的一致性,我注意到如果我在片段内调用这些变量,则永远不会 returns null。如果我从 activity 调用,returns null.

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