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子组件注入片段的适当位置在哪里?