【问题标题】:ViewModel object attribute uninitialized?ViewModel 对象属性未初始化?
【发布时间】:2018-08-30 08:23:15
【问题描述】:

我有时会收到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 时被初始化。任何想法如何重现这个?任何想法如何避免这种情况?

【问题讨论】:

  • 除了 "lateinit var car: String" 而不是 "var lateinit..." 这件事我试一试,但对我来说看起来不错

标签: android mvvm kotlin viewmodel


【解决方案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: car。所以它可以工作,但可能会出现错误,具体取决于您的实现。

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

var carObservable: MutableLiveData<String> = MutableLiveData()

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

在 Activity/Fragment 中:

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 的推荐方式(通过观察者模式的反应方式)。这样做可以确保即使您旋转屏幕或重新创建 Activity/Fragment,您的 car 变量也将可用。

【讨论】:

    猜你喜欢
    • 2021-06-11
    • 2021-01-09
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    相关资源
    最近更新 更多