Dagger 2依赖循环问题:Fragment注入ViewModel报错求解决方案
我来帮你梳理下问题所在,你遇到的依赖循环其实是因为ViewModelModule里的一行多余且错误的绑定代码导致的,咱们一步步来解决:
问题根源
你的ViewModelModule里写了这行代码:
@Binds ViewModelFactory bindViewModelFactory(ViewModelFactory viewModelFactory);
这行代码完全是多余的——因为ViewModelFactory已经有了@Inject注解的构造函数,Dagger可以直接通过构造函数创建它的实例。而这行@Binds绑定相当于告诉Dagger:“要获取ViewModelFactory,得先有一个ViewModelFactory”,这直接就造成了循环依赖的死锁,再加上ViewModelFactory需要注入到SplashFragment,SplashFragment又需要Component完成注入,最终形成了Dagger检测到的循环链。
具体解决步骤
删除多余的@Binds绑定
直接删掉ViewModelModule中的bindViewModelFactory方法,只保留ViewModel的映射绑定:@Binds @IntoMap @ViewModelKey(SplashViewModel.class) SplashViewModel bindSplashViewModel(SplashViewModel splashViewModel);确认组件依赖关系
确保你的FragmentComponent正确依赖了包含ViewModelModule的父组件(比如AppComponent或者ActivityComponent),这样Dagger才能获取到Map<Class<? extends ViewModel>, Provider<ViewModel>>这个ViewModel映射集合,从而正确实例化ViewModelFactory。验证Fragment的注入逻辑
检查SplashFragment中注入ViewModelFactory的方式是否正确,比如:public class SplashFragment extends Fragment { @Inject ViewModelFactory viewModelFactory; private SplashViewModel viewModel; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 获取FragmentComponent并完成注入 DaggerFragmentComponent.create().inject(this); // 通过Factory创建ViewModel viewModel = new ViewModelProvider(this, viewModelFactory).get(SplashViewModel.class); } }
额外注意事项
- 如果你给
ViewModelFactory添加了作用域注解(比如@FragmentScope),要确保这个作用域和FragmentComponent的作用域一致,避免作用域不匹配导致的其他注入问题。 SplashViewModel的构造函数用@Inject注解是正确的,Dagger会自动为它提供IAuthRepository依赖,只要IAuthRepository已经在组件中正确绑定。
内容的提问来源于stack exchange,提问作者syncended

