您应该在哪里使用具有PerFragment范围的Dagger2子组件注入片段?

时间:2017-12-01 19:51:21

标签: android android-fragments dagger-2

Google Dagger2文档说明你应该在它的onAttach方法中注入一个片段: https://google.github.io/dagger/users-guide.html

在尝试实现appComponent,activityComponent和fragmentComponent等子组件时,我遇到了问题。

问题在于:

给定一个viewpager包含3个片段的活动......

要注入给定的片段,我将从现有的activityComponent创建一个fragmentComponent,它自己在activity'onCreateMethod中创建。 e.g。

public class InjectFragment extends Fragment {

private FragmentComponent fragmentComponent;

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if(fragmentComponent == null){
        InjectActivity injectActivity = (InjectActivity) getActivity();
        if (injectActivity != null) {
            ActivityComponent activityComponent = injectActivity.getActivityComponent();
            if(activityComponent != null){
                fragmentComponent = activityComponent.plus(new FragmentModule());
            }
            else {
                throw new IllegalStateException("Cannot inject fragment: activityComponent is unexpectedly null.");
            }
        }
        else {
            throw new IllegalStateException("Cannot inject fragment: activity is unexpectedly null.");
        }
    }
    else{
        //fragmentComponent has been retained 
    }
}

...

这在首次创建活动时工作正常,因为在onCreate方法中创建activityComponent之前,我才在视图寻呼机中创建片段。

这在方向更改时工作正常,因为viewPager会自动保留片段,因为要保留fragmentComponent,所以不需要再次重新创建它。

这不起作用,但是当您按下主页按钮,但后台的应用程序时,系统会终止该过程,然后您从最近的屏幕点击应用程序以恢复它。在这种情况下,应用程序正在抛出:

Caused by: java.lang.IllegalStateException: Cannot inject fragment: activityComponent is unexpectedly null.
                                                 at com.example.test.config.dagger.base.InjectFragment.onAttach(InjectFragment.java:32)
                                                 at com.example.test.features.profile.ProfileFragment.onAttach(ProfileFragment.java:54)
                                                 at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1363)
                                                 at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1740)
                                                 at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1809)
                                                 at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3217)
                                                 at android.support.v4.app.FragmentManagerImpl.dispatchCreate(FragmentManager.java:3166)
                                                 at android.support.v4.app.FragmentController.dispatchCreate(FragmentController.java:181)
                                                 at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:319)
                                                 at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:84)
                                                 at com.example.test.config.dagger.base.InjectActivity.onCreate(InjectActivity.java:16)
                                                 at com.example.test.features.profile.ProfileActivity.onCreate(ProfileActivity.java:40)

在这种情况下,活动和片段都是从头开始重新创建的,但是在活动的onCreate方法从它调用super.onCreate()并且有机会初始化之前,正在调用片段的onAttach方法它是activityComponent字段。

我能看到的唯一方法就是在其onActivityCreated方法中注入片段,这样可以保证活动的onCreate已经完成,而不是官方文档建议的那样。

使用正确实现PerFragment范围的dagger2子组件注入片段的适当位置在哪里?

0 个答案:

没有答案