Кинжал 2 viewmodels и ViewModelProvider.Factory - PullRequest
0 голосов
/ 25 февраля 2019

Недавно у меня были проблемы с ViewModelProvider.Factory из-за того, что он не загружал все ViewModels проекта.

У меня есть Действия и фрагменты.Активные загружаются без каких-либо проблем, однако я попытался инкапсулировать FragmentViewModels внутри модуля, в котором я создаю фрагмент.

немного кода:

@Module(includes = [
  ... ,... ,...
])
class UIModule {

    @Singleton
    @Provides
    fun provideViewModelFactory(viewModels: MutableMap<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>)
        : ViewModelProvider.Factory {

        return object : ViewModelProvider.Factory {

            override fun <T : ViewModel> create(modelClass: Class<T>): T {
                return requireNotNull(viewModels[modelClass]).get() as T
            }
        }
    } 
}

Activity Builder

@Module
abstract class MainActivityBuilder {
....

@ActivityScope
@ContributesAndroidInjector(modules [XXXFragmentModule::class])
abstract fun bindBottomNavigationActivity(): BottomNavigationActivity

}

, так что это XXXFragmentModule

@Module(includes = [ActividadesFragmentModule.ViewModule::class])
abstract class ActividadesFragmentModule {

  ....

    @ContributesAndroidInjector
    internal abstract fun contributeSuggestedFragment(): SuggestedFragment


    @Module
    abstract class ViewModule {

        @Binds
        @IntoMap
        @ViewModelKey(SuggestedViewModel::class)
        internal abstract fun bindSuggestedViewModel(viewModel: SuggestedViewModel): ViewModel
    }
}

это не работает, viewModels первого блока кода имеет только ViewModels действий, он не добавляет эту последнюю ViewModel.Однако, если @ Module (включает в себя = [ActividadesFragmentModule.ViewModule :: class]) выполняется в ActivityBuilder , он действительно работает perfeclty

@Module(includes = [ActividadesFragmentModule.ViewModule::class])
abstract class MainActivityBuilder 

кто-то знает, чтоЯ делаю не так?

1 Ответ

0 голосов
/ 25 февраля 2019

Вам необходимо удалить область из вашего ViewModelProvider.Factory

@Singleton, и вы никогда не получите ничего из области действия или фрагмента.Удаляя область действия, вы создаете новую фабрику в каждом компоненте, где она может собирать дополнительные привязки, которые вы добавили в эти нижние области.

Сама фабрика довольно легкая, поэтому не должно быть проблем, если она остается незаданной.и воссоздается.@Reusable «Область действия» также должна работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...