Android ViewModel对象属性是否未初始化?

Android ViewModel对象属性是否未初始化?,android,mvvm,kotlin,viewmodel,Android,Mvvm,Kotlin,Viewmodel,我有时会从分析中得到一个UninitializedPropertyAccessException错误,但在我使用它的过程中,应用程序从未崩溃过。我认为在后台删除应用程序并终止进程之后,就会发生这种情况——但我无法重现这种错误 在我的活动中,我执行以下操作: private lateinit var viewModel: MyViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(save

我有时会从分析中得到一个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对象,并得到一个错误。问题是——这怎么可能发生?启用MyViewModel时初始化car对象。有没有办法复制这个?有没有办法避免这种情况?

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

lateinit var car: String

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

viewModel.init("car")
Log.d("CAR_DEBUG",viewModel.car)
并在我的控制台中收到预期的输出:D/CAR\u DEBUG:CAR。因此它可以工作,但可能会出现错误,具体取决于您的实现

此外,这不是正确的方法,我建议使用MutableLiveData观察者模式,以确保不会由于屏幕旋转或活动/片段重新创建而发生任何意外行为。记住这一点,将代码更改为:

var carObservable: MutableLiveData<String> = MutableLiveData()

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

这样,即使在observe调用之后调用init函数,也可以确保只有在值更改时才会收到通知。这实际上是通过观察者模式使用ViewModels的推荐方法。执行此操作时,请确保即使您旋转屏幕或重新创建活动/片段,您的car变量也将可用。

除了lateinit var car:String not var lateinit这一事实之外。。。我试一下,但我觉得不错
viewModel.carObservable.observe(this, Observer {
    Log.d("CAR_DEBUG",it)
})
// doesnt matter where your viewModel.init this will still work
viewModel.init("car")