视图模型对象属性未初始化?



我有时会收到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_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 的推荐方式(通过观察者模式的反应方式(。这样做可以确保即使您旋转屏幕或重新创建活动/片段,您的汽车变量也将可用。

相关内容

  • 没有找到相关文章

最新更新