观察者具有空对象,即使该对象是在上方正确实例化的

时间:2019-08-19 16:03:57

标签: android kotlin

我的应用程序中具有此功能:

fun bindUI() = launch(Dispatchers.Main){
        val locationResults = locationViewModel.locationResponse
        val owner = viewLifecycleOwner

        locationResults.observe(owner, Observer {
            if (it == null) return@Observer

            // TODO: set loading icon to GONE

            initRecyclerView(it.features.toLocationSearchResultListItem())
        })
    }

在应用程序中按下某个按钮时将触发此功能。调试代码时,locationResults字段设置为RoomTrackingLiveData对象,但是当它到达观察者内部的if条件时,it为null,并且从函数中返回。在这种情况下,it的类型为LocationSearchResponse!locationViewModel.locationResponse的类型为LiveData<out LocationSearchResponse>

为什么it在刚从几行之前从该变量正确检索结果后立即为空?

1 个答案:

答案 0 :(得分:0)

Dispatcher.Main可能是UI线程,但是UI线程本身不具有活动和片段之类的视图生命周期。

您必须将视图模型绑定到片段或活动中,否则viewLifecycleOwner将为空。

考虑一下这是不可行的,因为您可能同时在屏幕上说了5个片段。它们全部在具有单独生命周期的UI线程上运行。您认为其中的女巫应该引用viewLifecycleOwner吗?

自从您说过,这是通过单击按钮运行的。只需删除协程,它应该可以工作。

如果您希望使用协程并使其具有生命周期意识,那么还有一个生命周期感知的协程范围'viewLifecycleOwner.lifecycleScope.launch'。但我真的不明白这一点。虽然有可能,但也许有一点意义,有人可以启发我。 ^^

好像不是@ianhanniballake表示LiveData的数据可能为空的问题。您可以使用locationResults.value获取数据,或者在调试locationResults时应包含一个字段mData。那是后来的您的it