Решение
Проблема в том, что я создавал провайдера для каждой ViewModel в классе ViewModelModule, который включен в AppModule.
Каждая активность, созданная с помощью @ContributeAndroidInjection, является подкомпонентом.
Таким образом, компонент App и компонент Sub Activity различаются.Компонент Activity может получить доступ к поставщику компонента App, но не наоборот, что причина внедрения уже существует. Ошибка
Я решил проблему, включив модель представления внутри модуля действия вместо модуля appcomponent.
ViewModelModule
До
@Module
public abstract class ViewModelModule {
@Binds
@IntoMap//<---- Here is the new ViewModel
@ViewModelKey(ItemDetailViewModel.class)
abstract ViewModel provideItemDetailViewModel(ItemDetailViewModel
itemDetailViewModel);
@Binds
abstract ViewModelProvider.NewInstanceFactory
getViewModelFactory(ViewModelFactory viewModelFactory);
}
После - в ViewModelModule необходим только ViewModelFactory, чтобы переместить всех ваших поставщиков ViewModel в действиеmodule.
@Module
public abstract class ViewModelModule {
@Binds
abstract ViewModelProvider.NewInstanceFactory
getViewModelFactory(ViewModelFactory viewModelFactory);
}
ItemDetailProvider
Создать абстрактный класс для хранения поставщиков ViewModel
@Module
public abstract class ItemDetailProvider {
@Binds
@IntoMap
@ViewModelKey(ItemDetailViewModel.class)
abstract ViewModel provideItemDetailViewModel(ItemDetailViewModel
itemDetailViewModel);
}
ActivityModule
Теперь добавьте созданного поставщика вмодуль Activity, как показано ниже
До
@Module
public abstract class ActivityBuilder {
@ContributesAndroidInjector(modules =
{ItemDetailActivityModule.class})
abstract ItemDetailActivity contributeItemDetailActivity();
}
После - Теперь добавьте ViewModel, который corespond, к вышеуказанной активности в моем случае этоэто ItemDetailViewModel class
@Module
public abstract class ActivityBuilder {
@ContributesAndroidInjector(modules =
{ItemDetailActivityModule.class,ItemDetailProvider.class})//<--- provider added in this line
abstract ItemDetailActivity contributeItemDetailActivity();
}