Мультисвязывание кинжалов в моделях представления обеспечивает внедрение вместо конструктора - PullRequest
0 голосов
/ 24 июня 2019

Все примеры того, как комбинировать 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 здесь.

...