我正在将我的应用程序转换为使用 ViewModel
。为了实例化 ViewModel
,我使用自定义 Factory
和 Dagger 2 进行依赖注入(inject)。它看起来像这样:
@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
}
现在我面临的问题是,如何在 中访问我的
。这是必要的,因为 Fragment
或 Activity
的 Arguments/Extras Bundle
View 模型ViewModel
中的 View 和数据通常是可参数化的。我将如何使用最少的样板文件来实现它?
最佳答案
如何将此类额外内容/参数注入(inject)您的 View 模型?您可以通过使用 Dagger 访问此类 Activity/fragment 来实现此目的。
@Module
class IntentModule {
@Provides
fun retriveIntentWithExtraX(activity: DestinationActivity): Long {
return activity.intent.getSerializableExtra(SOME_EXTRA_DATA) as Long
}
}
以及包含您的 Activity/fragment 的内部模块:
@Module
abstract class ActivityModules {
@ContributesAndroidInjector(modules = [IntentModule::class])
abstract fun contributeDestinationActivity(): DestinationActivity
}
最后,您可以像这样将此类参数/额外信息注入(inject)到您的 ViewModel 中:
class SomeViewModel @Inject constructor(
private val someExtraData: Long
) : ViewModel()
关于android - 如何使用 Dagger 2 以最少的样板访问 ViewModel 中的 Arguments/Extras Bundle?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52701022/