【发布时间】:2020-09-13 05:02:20
【问题描述】:
我正在尝试实例化我的 ViewModel,以便根据给定的参数显示不同的列表。但是,我对 init 和构造函数调用有点困惑。
以下版本给我一个MainViewModel> has no zero argument constructor 错误。
版本 1
class MainViewModel(private val param: String) : ViewModel() {
private var list: ArrayList<ModelDialogOption>? = null
val userMutableLiveData: MutableLiveData<ArrayList<ModelDialogOption>?> = MutableLiveData()
init {
populateList()
userMutableLiveData.value = list!!
}
private fun populateList() {
list = ArrayList()
when (param) {
"Choose your age range" -> {
list!!.add(ModelDialogOption("Prefer not to say", false))
list!!.add(ModelDialogOption("16-39", false))
list!!.add(ModelDialogOption("40-59", true))
list!!.add(ModelDialogOption("60+", false))
}
}
}
}
第 2 版
而这给了我一个空列表没有找到参数,因为构造函数仅在初始化发生后才被调用:
class MainViewModel() : ViewModel() {
var param: String? = null
private var list: ArrayList<ModelDialogOption>? = null
val userMutableLiveData: MutableLiveData<ArrayList<ModelDialogOption>?> = MutableLiveData()
init {
populateList()
userMutableLiveData.value = list!!
}
constructor(param: String) : this() {
this.param = param
populateList()
userMutableLiveData.value = list!!
}
private fun populateList() {
list = ArrayList()
when (param) {
"Choose your age range" -> {
list!!.add(ModelDialogOption("Prefer not to say", false))
list!!.add(ModelDialogOption("16-39", false))
list!!.add(ModelDialogOption("40-59", true))
list!!.add(ModelDialogOption("60+", false))
}
}
}
}
这里还有一个空列表:
第 3 版
class MainViewModel() : ViewModel() {
var param: String? = null
private var list: ArrayList<ModelDialogOption>? = null
val userMutableLiveData: MutableLiveData<ArrayList<ModelDialogOption>?> = MutableLiveData()
constructor(param: String) : this() {
this.param = param
populateList()
userMutableLiveData.value = list!!
}
private fun populateList() {
list = ArrayList()
when (param) {
"Choose your age range" -> {
list!!.add(ModelDialogOption("Prefer not to say", false))
list!!.add(ModelDialogOption("16-39", false))
list!!.add(ModelDialogOption("40-59", true))
list!!.add(ModelDialogOption("60+", false))
}
}
}
}
第 4 版
这给了我列表填充,但肯定没有参数,因为没有传递任何参数,只是将它用作我的起点:
class MainViewModel : ViewModel() {
private var list: ArrayList<ModelDialogOption>? = null
val userMutableLiveData: MutableLiveData<ArrayList<ModelDialogOption>?> = MutableLiveData()
init {
populateList()
userMutableLiveData.value = list!!
}
private fun populateList() {
list = ArrayList()
list!!.add(ModelDialogOption("Prefer not to say", false))
list!!.add(ModelDialogOption("16-39", false))
list!!.add(ModelDialogOption("40-59", true))
list!!.add(ModelDialogOption("60+", false))
}
}
这是我的 ViewModelFactory:
public class MyViewModelFactory implements ViewModelProvider.Factory {
private String param;
public MyViewModelFactory(String param) {
this.param = param;
}
@NotNull
@Override
public <T extends ViewModel> T create(@NotNull Class<T> modelClass) {
return (T) new MainViewModel(param);
}
}
以这种方式启动:
private val viewModel: MainViewModel by activityViewModels {
MyViewModelFactoryForHashMap(
arguments?.getString("headerText")
)
}
非常感谢。
【问题讨论】:
-
您的版本 1 应该可以正常工作。你能包括完整的堆栈跟踪吗?
-
您好,开头是这样的:
java.lang.RuntimeException: Cannot create an instance of class com.example.covidtracker.view_models.MainViewModel -
连接到我的片段上的这个位
model.userMutableLiveData.observe(viewLifecycleOwner, Observer<Any?> { list -> if (list != null) (list as Iterable<*>).map { if ((it as ModelDialogOption).selected == true) { etYourAge.text = it.title } } })
标签: android kotlin constructor viewmodel android-viewmodel