ViewModel对象属性未初始化?

时间:2018-08-30 08:23:15

标签: android mvvm kotlin viewmodel

我有时会从分析中得到UninitializedPropertyAccessException的错误,但是在我使用它的过程中,该应用程序从未崩溃。我认为在将应用程序置于后台并杀死进程之后,就会发生这种情况-但我无法重现此错误。

在我的活动中,我执行以下操作:

private lateinit var viewModel: MyViewModel

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.xxx)
    ... // doing other stuff
    viewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
    viewModel.init(
            ...,
            ...,
            ...,))
    setUpObservables()
}

我的MyViewModel如下:

class MyViewModel : ViewModel() {

var lateinit car: String 

fun init(
        car: String,
        ...: String?,
        ...: Boolean 
) {
    if (isInitialized) {
        return
    }
    this.car = car
    ...

    isInitialized = true
}

稍后,我尝试访问car对象,如果该对象未初始化,则会出现错误。问题是-这怎么会发生? car初始化MyViewModel对象。有什么想法可以重现吗?任何想法如何避免这种情况?

1 个答案:

答案 0 :(得分:1)

好,所以我已经在一个工作项目的ViewModel中添加了这样的代码。

lateinit var car: String

fun init(car: String) {
    this.car = car
}

并称为:

viewModel.init("car")
Log.d("CAR_DEBUG",viewModel.car)

并在我的控制台中收到了预期的输出: D / CAR_DEBUG:汽车。这样就可以了,但是根据您的实现,可能会出现错误。

此外,这也不是正确的方法,我建议使用MutableLiveData观察器模式,以确保不会因屏幕旋转或活动/碎片重新出现任何意外行为。考虑到这一点,将您的代码更改为此:

var carObservable: MutableLiveData<String> = MutableLiveData()

fun init(car: String) {
    carObservable.value = car
}

在“活动/片段”中:

viewModel.carObservable.observe(this, Observer {
    Log.d("CAR_DEBUG",it)
})
// doesnt matter where your viewModel.init this will still work
viewModel.init("car")

这样,即使您在观察调用之后调用了init函数,也可以确保仅在值更改时才得到通知。实际上,这是使用ViewModels的推荐方式(通过观察者模式的反应方式)。并执行此操作,以确保即使旋转屏幕或重新创建“活动/片段”,您的汽车变量也将可用。