Все примеры того, как комбинировать ViewModel с dagger2, заключались в использовании инъекции конструктора в ViewModelFactory. Как это:
private final Map<Class<? extends ViewModel>, Provider<ViewModel>> providers;
@Inject
public ViewModelFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> providers) {
this.providers = providers;
}
Хотя модуль может выглядеть примерно так.
@Module
abstract class ViewModelModule {
@SuppressWarnings("unused")
@Binds
@IntoMap
@ViewModelKey(value = SomeViewModel.class)
abstract ViewModel bindSomeViewModel(SomeViewModel viewModel);
@SuppressWarnings("unused")
@Binds
abstract ViewModelProvider.Factory
bindViewModelFactory(ViewModelFactory viewModelFactory);
}
Теперь, потому что мне нравится писать повторно используемый код, и я хотел бы перенести фабрику в другой модуль библиотеки Android. Поэтому я хотел бы иметь возможность сделать что-то вроде этого:
Новый конструктор (только что удаленный @Inject):
private final Map<Class<? extends ViewModel>, Provider<ViewModel>> providers;
public ViewModelFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> providers) {
this.providers = providers;
}
И модуль:
@Module
abstract class ViewModelModule {
@SuppressWarnings("unused")
@Binds
@IntoMap
@ViewModelKey(value = SomeViewModel.class)
abstract ViewModel bindSomeViewModel(SomeViewModel viewModel);
@SuppressWarnings("unused")
@Provides
ViewModelProvider.Factory
provideViewModelFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> providers) {
// Manually creates the ViewModelFactory.
return new ViewModelFactory(providers);
}
}
Это дает мне следующую ошибку
error: com.example.project.ViewModelModule has errors
Вопрос
Как внедрить ViewModelProvider.Factory, находящийся в другом модуле, используя @Provides, который использует возможные модели представлений, которые он создает в конструкторе?
По сути, я не хочу использовать @Provides и явно вызывать конструктор вместо того, чтобы позволить Dagger делать это с инжекцией конструктора, используя @Binds здесь.