我在导航组件中使用共享的ViewModel,而不是为每个片段创建一个ViewModel(主要是因为它更容易),但是现在当我重新输入一个片段并订阅该片段的ViewModel实时数据时遇到了一个问题,我也得到了最后一个状态。
这是ViewModel代码:
val apiLessonData: MutableLiveData<String>> = MutableLiveData()
fun getLessonsUserCreated() =
apiCall(MyMaybeObserver(apiLessonData))
在MyMaybeObserver中,我有这样的东西:
override fun onSuccess(t: T) {
apiDataObserver.postValue(t)
}
这就是我在片段中观察它的方式:
private val apiAddGoalData = Observer<String> { response ->
showSnack(response)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
.
.
viewModel.apiAddGoalData.observe(viewLifecycleOwner, apiAddGoalData)
.
.
}
现在,当我第一次输入时,它可以正常工作,但是第二次打开时,它显示了上一个时间的小吃,如何停止而不创建它新的ViewModel?
答案 0 :(得分:2)
以简单的方式,您可以通过观察者的MutableLiveData
方法获取数据后,为onchange
设置null。有关更多信息,您可以阅读本文:livedata-with-snackbar-navigation-and-other-events-the-singleliveevent-case
。还可以看到此问题可能对您有所帮助:How to clear LiveData stored value?
答案 1 :(得分:1)
我不认为您的问题出在LiveData上,因为您明智地使用了ViewLifecycleOwner,问题在于视图的状态和片段的lifeCycle。使用jetpack的导航组件,可以将碎片替换到容器中。考虑这种情况:打开片段A,然后导航到帧B,然后按返回按钮返回片段A。再次调用片段A的onCreateView和onViewCreated方法。由于打开片段B时尚未调用片段A的onDestroy,因此返回A时将还原某些视图状态。这就是您可能知道的相同原因,因为我们使用viewLifecycleOwner。因此,在片段A的onDestroyView中取消或清除视图状态:
recyclerView.setAdapter(null)
checkBox.setChecked(false)