Search code examples
dagger-2dagger

Dagger 2 dependency cycle


I've next problem with injecting ViewModel into fragment:

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)

Where FragmentComponent code:

public interface FragmentComponent {
    void inject(SplashFragment splashFragment);
}

ViewModelFactory code:

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 code:

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

And SplashViewModel code:

@Inject
public SplashViewModel(IAuthRepository repository) ...

How I can to solve that? It's isn't like that it has dependency cycle


Solution

  • I've solved that problem by next solution:

    I changed ViewModelModule code from:

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

    To:

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