ViewModel
使用的越来越多了,严格来说,官方并不建议你在ViewModel
中添加Context
的引用。同时,ViewModel
的构造方法是没有任何参数的,有的时候会很不灵活。以下记录两种方法。
#1.通过kotlin的拓展函数1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
fun <T : ViewModelProvider, V : ViewModel> T.get(
key: String,
modelClass: Class<V>,
context: FragmentActivity
): V {
val model = get(key, modelClass)
if (model is TestViewModel) {
model.addContext(context)
}
return model
}
fun <T : ViewModelProvider, V : ViewModel> T.get(
key: String,
modelClass: Class<V>,
context: Context
): V {
val model = get(key, modelClass)
if (model is TestViewModel) {
model.addContext(context)
}
return model
}
fun <T : ViewModelProvider, V : ViewModel> T.get(
modelClass: Class<V>,
context: FragmentActivity
): V {
val model = get(modelClass)
if (model is TestViewModel) {
model.addContext(context)
}
return model
}
fun <T : ViewModelProvider, V : ViewModel> T.get(
modelClass: Class<V>,
context: Context
): V {
val model = get(modelClass)
if (model is TestViewModel) {
model.addContext(context)
}
return model
}
在TestViewModel
中添加如下的方法1
2
3
4
5
6
7
8
9
10class TestViewModel : ViewModel() {
protected lateinit var context: Context
open fun addContext(context: FragmentActivity) {
this.context = context
}
open fun addContext(context: Context) {
this.context = context
}
}
使用方法1
val viewModel = ViewModelProvider(this).get(TestViewModel::class.java, this)
#2.通过自定义ViewModelProvider.Factory
1 | class CoreViewModelFactory(private val context: Context) : ViewModelProvider.Factory { |
关于这一块,仔细阅读ViewModelProvider的代码,会发现,里面同样提供了两三种的Factory。针对可以直接拥有context
的AndroidViewModel
,提供了ViewModelProvider.AndroidViewModelFactory
,只是在引用的时候,不要再自己添加一遍了。
以下是你的TestViewModel
1
2
3
4
5class TestViewModel(private val context: Context) : ViewModel() {
init {
L.i(" context $context ")
}
}
使用方法1
val viewModel = ViewModelProvider(this, CoreViewModelFactory(this)).get(TestViewModel::class.java)
以上两种方法也可以用来帮助你自定义一些你要传入的参数。