Dagger 2 依赖循环
Dagger 2 dependency cycle
下一个将 ViewModel 注入片段的问题:
error: [Dagger/DependencyCycle] Found a dependency cycle:
public interface FragmentComponent {
^
...ViewModelFactory is injected at
...ViewModelModule.bindViewModelFactory(viewModelFactory)
...ViewModelFactory is injected at
...SplashFragment.viewModelFactory
...SplashFragment is injected at
...FragmentComponent.inject(ru.syncended.jlocationtracker.auth.fragments.SplashFragment)
其中FragmentComponent代码:
public interface FragmentComponent {
void inject(SplashFragment splashFragment);
}
ViewModelFactory 代码:
private final Map<Class<? extends ViewModel>, Provider<ViewModel>> viewModelProviders;
@Inject
public ViewModelFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> viewModelProviders) {
this.viewModelProviders = viewModelProviders;
}
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
Provider<ViewModel> viewModelProvider = viewModelProviders.get(modelClass);
return (T) viewModelProvider.get();
}
ViewModelModule 代码:
@Binds
ViewModelFactory bindViewModelFactory(ViewModelFactory viewModelFactory);
@Binds
@IntoMap
@ViewModelKey(SplashViewModel.class)
SplashViewModel bindSplashViewModel(SplashViewModel splashViewModel);
和 SplashViewModel 代码:
@Inject
public SplashViewModel(IAuthRepository repository) ...
我该如何解决?它不像它有依赖周期
@Binds
ViewModelFactory bindViewModelFactory(ViewModelFactory viewModelFactory);
这是一个大小为 1 的依赖“循环”。它告诉 Dagger,为了获得 ViewModelFactory
的实例,您必须首先获得 ViewModelFactory
的实例并使用它。这将替换原本会使用的 @Inject
构造函数。
要解决此问题,只需删除此 @Binds
方法即可。 Dagger 已经知道如何从其 @Inject
构造函数创建 ViewModelFactory
。或者,您可以改为依赖 ViewModelProvider.Factory
接口,并相应地更改 @Binds
方法的 return 类型。
我已经通过下一个解决方案解决了这个问题:
我更改了 ViewModelModule 代码:
@Binds
@IntoMap
@ViewModelKey(SplashViewModel.class)
SplashViewModel bindSplashViewModel(SplashViewModel splashViewModel);
收件人:
@Binds
@IntoMap
@ViewModelKey(SplashViewModel.class)
ViewModel bindSplashViewModel(SplashViewModel splashViewModel);
下一个将 ViewModel 注入片段的问题:
error: [Dagger/DependencyCycle] Found a dependency cycle:
public interface FragmentComponent {
^
...ViewModelFactory is injected at
...ViewModelModule.bindViewModelFactory(viewModelFactory)
...ViewModelFactory is injected at
...SplashFragment.viewModelFactory
...SplashFragment is injected at
...FragmentComponent.inject(ru.syncended.jlocationtracker.auth.fragments.SplashFragment)
其中FragmentComponent代码:
public interface FragmentComponent {
void inject(SplashFragment splashFragment);
}
ViewModelFactory 代码:
private final Map<Class<? extends ViewModel>, Provider<ViewModel>> viewModelProviders;
@Inject
public ViewModelFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> viewModelProviders) {
this.viewModelProviders = viewModelProviders;
}
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
Provider<ViewModel> viewModelProvider = viewModelProviders.get(modelClass);
return (T) viewModelProvider.get();
}
ViewModelModule 代码:
@Binds
ViewModelFactory bindViewModelFactory(ViewModelFactory viewModelFactory);
@Binds
@IntoMap
@ViewModelKey(SplashViewModel.class)
SplashViewModel bindSplashViewModel(SplashViewModel splashViewModel);
和 SplashViewModel 代码:
@Inject
public SplashViewModel(IAuthRepository repository) ...
我该如何解决?它不像它有依赖周期
@Binds
ViewModelFactory bindViewModelFactory(ViewModelFactory viewModelFactory);
这是一个大小为 1 的依赖“循环”。它告诉 Dagger,为了获得 ViewModelFactory
的实例,您必须首先获得 ViewModelFactory
的实例并使用它。这将替换原本会使用的 @Inject
构造函数。
要解决此问题,只需删除此 @Binds
方法即可。 Dagger 已经知道如何从其 @Inject
构造函数创建 ViewModelFactory
。或者,您可以改为依赖 ViewModelProvider.Factory
接口,并相应地更改 @Binds
方法的 return 类型。
我已经通过下一个解决方案解决了这个问题:
我更改了 ViewModelModule 代码:
@Binds
@IntoMap
@ViewModelKey(SplashViewModel.class)
SplashViewModel bindSplashViewModel(SplashViewModel splashViewModel);
收件人:
@Binds
@IntoMap
@ViewModelKey(SplashViewModel.class)
ViewModel bindSplashViewModel(SplashViewModel splashViewModel);