ViewModel中传入Context的方法
ViewModel
使用的越来越多了,严格来说,官方并不建议你在ViewModel
中添加Context
的引用。同时,ViewModel
的构造方法是没有任何参数的,有的时候会很不灵活。以下记录两种方法。
1.通过kotlin的拓展函数
fun T.get(
key: String,
modelClass: Class,
context: FragmentActivity
): V {
val model = get(key, modelClass)
if (model is TestViewModel) {
model.addContext(context)
}
return model
}fun T.get(
key: String,
modelClass: Class,
context: Context
): V {
val model = get(key, modelClass)
if (model is TestViewModel) {
model.addContext(context)
}
return model
}fun T.get(
modelClass: Class,
context: FragmentActivity
): V {
val model = get(modelClass)
if (model is TestViewModel) {
model.addContext(context)
}
return model
}fun T.get(
modelClass: Class,
context: Context
): V {
val model = get(modelClass)
if (model is TestViewModel) {
model.addContext(context)
}
return model
}
在
TestViewModel
中添加如下的方法class TestViewModel : ViewModel() {
protected lateinit var context: Context
open fun addContext(context: FragmentActivity) {
this.context = context
}open fun addContext(context: Context) {
this.context = context
}
}
使用方法
val viewModel = ViewModelProvider(this).get(TestViewModel::class.java, this)
2.通过自定义ViewModelProvider.Factory
class CoreViewModelFactory(private val context: Context) : ViewModelProvider.Factory {
override fun create(modelClass: Class): T {
try {
for (constructor in modelClass.constructors) {
if (arrayOf(Context::class.java).contentEquals(constructor.parameterTypes)) {
return (constructor as Constructor).newInstance(context)
}
}
return modelClass.newInstance()
} catch (e: InstantiationException) {
throw RuntimeException("Cannot create an instance of $modelClass", e)
} catch (e: IllegalAccessException) {
throw RuntimeException("Cannot create an instance of $modelClass", e)
}
}
}
关于这一块,仔细阅读ViewModelProvider的代码,会发现,里面同样提供了两三种的Factory。针对可以直接拥有
context
的AndroidViewModel
,提供了ViewModelProvider.AndroidViewModelFactory
,只是在引用的时候,不要再自己添加一遍了。以下是你的
TestViewModel
class TestViewModel(private val context: Context) : ViewModel() {
init {
L.i(" context $context ")
}
}
【ViewModel中传入Context的方法】使用方法
val viewModel = ViewModelProvider(this, CoreViewModelFactory(this)).get(TestViewModel::class.java)
以上两种方法也可以用来帮助你自定义一些你要传入的参数。
推荐阅读
- 热闹中的孤独
- Shell-Bash变量与运算符
- JS中的各种宽高度定义及其应用
- 2021-02-17|2021-02-17 小儿按摩膻中穴-舒缓咳嗽
- 深入理解Go之generate
- 异地恋中,逐渐适应一个人到底意味着什么()
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- “成长”读书社群招募
- 2020-04-07vue中Axios的封装和API接口的管理