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

标签 android dependency-injection kotlin android-architecture-components

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

相关文章:

android - 从 Handler 和 Thread 扩展类时有什么区别? (在安卓框架下)

android - 禁用分屏android

c# - 注册模块 Autofac

kotlin - 检查 Kotlin 变量是否为函数

gradle - 构建应用程序时如何使用 KotlinPoet 生成代码? (毕业)

android - 可扩展列表让 ChildView 每个 child 运行两次

c# - 一个 IoC 容器对于一个非常简单的框架来说是否有点矫枉过正?

java - Dagger 2 和接口(interface)实现

android - 给定的 Artifact 包含一个字符串文字,其包引用为 'android.support.v4',无法安全地重写

java - 如何在 android studio 中的复选框的 switch case 语句中使用 OR