演示者有时 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()。这将解决问题。
我在 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()。这将解决问题。