0
我在我的應用程序中使用Dagger 2到DI和MVP。我注入組件上的onCreate方法,像這樣(在片段它`):演示者有時返回null
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;
}
有時我調用一個方法(從活動,兩者的整個生命週期都結束時,用戶可以調用該方法隨時[
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();
}
模塊:
使用myPresenter,這樣滑動以刷新])@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。如果我從活動中調用,則返回null。
您的模塊實際上並未提供演示者的實例。我不明白爲什麼這應該工作。另外,您的演示者實例隨着您的循環活動而死亡,所以我希望您使用'onSaveInstanceState()'來管理它。 – EpicPandaForce
在這種情況下,onCreate()會再次被調用,而不是?但我不旋轉屏幕,我在生命週期中不做任何事情。 –
啊...按照你的鏈接https://github.com/JorgeCastilloPrz/Dagger2Scopes/blob/master/android/src/main/java/com/github/jorgecastilloprz/dagger2scopes/android/di/GameDetailsModule.java你在構造函數中指定@Inject,並允許您將其作爲參數接收。有趣的是,我不知道dagger2可以做到這一點。但是我認爲參數中的綁定實現類是適得其反的。無論如何,刪除我的答案,直到我弄清楚什麼是。 – EpicPandaForce