Как получить доступ к Arguments / Extras Bundle в ViewModel с минимальным шаблоном, используя Dagger 2? - PullRequest
0 голосов
/ 08 октября 2018

Я перевожу свое приложение для использования ViewModel s.Для создания экземпляров ViewModel я использую пользовательский Factory и Dagger 2 для внедрения зависимостей.Это выглядит так:

@Singleton
class ViewModelFactory @Inject constructor(
    private val viewModels: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>
) : ViewModelProvider.Factory {

    override fun <T : ViewModel> create(modelClass: Class<T>): T 
        = viewModels[modelClass]!!.get() as T
}

@Target(AnnotationTarget.FUNCTION) @Retention(AnnotationRetention.RUNTIME) @MapKey
annotation class ViewModelKey(val value: KClass<out ViewModel>)

@Module
abstract class ViewModelModule {

    @Binds
    abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory

    @Binds @IntoMap @ViewModelKey(FooViewModel::class)
    abstract fun fooViewModel(viewModel: FooViewModel): ViewModel
}

Теперь я сталкиваюсь с вопросом, как получить доступ к Аргументам / Дополнениям Bundle моего Fragment или Activity внутри ViewModel.Это необходимо, потому что представления и, следовательно, данные в ViewModel часто параметризуются.Как бы я это реализовал, используя наименьшее количество шаблонов?

1 Ответ

0 голосов
/ 08 октября 2018

А как насчет введения таких дополнений / аргументов в ваши модели представления?Вы можете достичь этого, получив доступ к такой деятельности / фрагменту с помощью кинжала.

@Module
class IntentModule {
    @Provides
    fun retriveIntentWithExtraX(activity: DestinationActivity): Long {
        return activity.intent.getSerializableExtra(SOME_EXTRA_DATA) as Long
    }
}

И внутри модуля с вашими активностями / фрагментами:

@Module
abstract class ActivityModules {

    @ContributesAndroidInjector(modules = [IntentModule::class])
    abstract fun contributeDestinationActivity(): DestinationActivity

}

наконец вы можете добавить такие аргументы / дополнительные в вашViewModels как это:

class SomeViewModel @Inject constructor(
    private val someExtraData: Long
) : ViewModel() 
...