匕首2依赖周期

时间:2020-08-29 21:22:42

标签: dagger-2 dagger

下一个将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) ...

我该如何解决?它不是有依赖周期的

2 个答案:

答案 0 :(得分:0)

@Binds
ViewModelFactory bindViewModelFactory(ViewModelFactory viewModelFactory);

这是大小为1的依赖项“循环”。它告诉Dagger,要获取ViewModelFactory的实例,必须首先获取ViewModelFactory的实例并使用它。这将替换本应使用的@Inject构造函数。

要解决此问题,只需删除此@Binds方法。 Dagger已经知道如何从其ViewModelFactory构造函数创建一个@Inject。另外,您可以改为依赖ViewModelProvider.Factory接口,并相应地更改@Binds方法的返回类型。

答案 1 :(得分:0)

我已经通过下一个解决方案解决了这个问题:

我从以下位置更改了ViewModelModule代码:

@Binds
@IntoMap
@ViewModelKey(SplashViewModel.class)
SplashViewModel bindSplashViewModel(SplashViewModel splashViewModel);

收件人:


@Binds
@IntoMap
@ViewModelKey(SplashViewModel.class)
ViewModel bindSplashViewModel(SplashViewModel splashViewModel);
相关问题