android-studio - 如何使用 Dagger2 android 为 ViewModel 使用构造函数注入?
问题描述
我想将 ViewModel 与 Dagger2 一起使用,但我不知道如何将构造函数注入与 ViewModelProviders 或 ViewModelProvider.Factory 一起使用
如何将 ViewModel 与构造函数注入一起使用?我应该使用 ViewModelProvider.Factory 还是 ViewModelProviders?
更新: 您可以在此链接中找到包含详细信息的解决方案
解决方案
您可以创建自己的自定义类扩展ViewModelProvider.Factory
class ViewModelFactory @Inject constructor(
private val providers: @JvmSuppressWildcards Map<Class<out ViewModel>, Provider<ViewModel>>
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
var provider = providers[modelClass]
if (provider == null) {
for ((key, value) in providers) {
if (modelClass.isAssignableFrom(key)) {
provider = value
break
}
}
}
if (provider == null) {
throw IllegalStateException("unknown model class $modelClass")
}
return provider.get() as T
}
}
为这个类创建模块并将模块注入你的ApplicationComponent
类
@Module
abstract class ViewModelFactoryModule {
@Binds
abstract fun bindViewModelFactory(viewModelFactory: ViewModelFactory): ViewModelProvider.Factory
}
然后在你的片段里面注入这个工厂
@Inject
lateinit var factory: ViewModelProvider.Factory
并像这样初始化您的viewModel
val vm: YourViewModel by viewModels { factory }
推荐阅读
- xml - 为什么 XSL/XPath 认为这个零是一个字符串?
- sql - 使用垂直连接sql重构表
- javascript - 使地图以地图上的点为中心
- python - 二维数组中的列表索引超出范围 0
- postgresql - 没有时间订单,但需要出示
- javascript - 重新加载页面后在javascript函数中通过id更改div的颜色
- r - R:指定颜色以影响绘图
- azure-functions - Azure Functions CosmosDb 输出绑定 ConnectionStringSetting 的存储位置
- laravel - 如何获取 AWS S3 中使用 Laravel 中的存储门面访问的图像的尺寸?
- c++ - Mysql C++ 连接器中的批量插入