【问题标题】:Dagger 2 dependency cycleDagger 2 依赖循环
【发布时间】:2020-08-29 21:22:42
【问题描述】:

我在将 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) ...

我该如何解决?它不像它有依赖循环

【问题讨论】:

    标签: dagger-2 dagger


    【解决方案1】:
    @Binds
    ViewModelFactory bindViewModelFactory(ViewModelFactory viewModelFactory);
    

    这是一个大小为 1 的依赖“循环”。它告诉 Dagger,为了获得 ViewModelFactory 的实例,您必须首先获得 ViewModelFactory 的实例并使用它。这将替换原本会使用的 @Inject 构造函数。

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

    【讨论】:

      【解决方案2】:

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

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

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

      收件人:

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

      【讨论】:

        猜你喜欢
        • 2018-11-30
        • 1970-01-01
        • 2015-10-13
        • 1970-01-01
        • 1970-01-01
        • 2015-08-07
        • 1970-01-01
        • 2017-02-26
        • 1970-01-01
        相关资源
        最近更新 更多