gpt4 book ai didi

android - 如何使用 Dagger 2 以最少的样板访问 ViewModel 中的 Arguments/Extras Bundle?

转载 作者:太空宇宙 更新时间:2023-11-03 10:33:39 25 4
gpt4 key购买 nike

我正在将我的应用程序转换为使用 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
}

现在我面临的问题是,如何在 中访问我的 FragmentActivity 的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com