2015-09-17 39 views
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。

+0

您的模塊實際上並未提供演示者的實例。我不明白爲什麼這應該工作。另外,您的演示者實例隨着您的循環活動而死亡,所以我希望您使用'onSaveInstanceState()'來管理它。 – EpicPandaForce

+0

在這種情況下,onCreate()會再次被調用,而不是?但我不旋轉屏幕,我在生命週期中不做任何事情。 –

+0

啊...按照你的鏈接https://github.com/JorgeCastilloPrz/Dagger2Scopes/blob/master/android/src/main/java/com/github/jorgecastilloprz/dagger2scopes/android/di/GameDetailsModule.java你在構造函數中指定@Inject,並允許您將其作爲參數接收。有趣的是,我不知道dagger2可以做到這一點。但是我認爲參數中的綁定實現類是適得其反的。無論如何,刪除我的答案,直到我弄清楚什麼是。 – EpicPandaForce

回答

1

將adapter.getItem()替換爲adapter.getPage()。這將解決問題。

相關問題