当我重新输入片段时,Android MutableLiveData会不断发出信号
我在导航组件中使用了一个共享的ViewModel,而不是为每个片段创建一个ViewModel(主要是因为它更容易),但是现在我遇到了一个问题,当我重新输入一个片段并订阅该片段的ViewModel实时数据时,我也得到了最后一个状态 以下是ViewModel代码:当我重新输入片段时,Android MutableLiveData会不断发出信号,android,android-fragments,android-livedata,android-viewmodel,Android,Android Fragments,Android Livedata,Android Viewmodel,我在导航组件中使用了一个共享的ViewModel,而不是为每个片段创建一个ViewModel(主要是因为它更容易),但是现在我遇到了一个问题,当我重新输入一个片段并订阅该片段的ViewModel实时数据时,我也得到了最后一个状态 以下是ViewModel代码: val apiLessonData: MutableLiveData<String>> = MutableLiveData() fun getLessonsUserCreated() = apiC
val apiLessonData: MutableLiveData<String>> = MutableLiveData()
fun getLessonsUserCreated() =
apiCall(MyMaybeObserver(apiLessonData))
这就是我在片段中观察它的方式:
private val apiAddGoalData = Observer<String> { response ->
showSnack(response)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
.
.
viewModel.apiAddGoalData.observe(viewLifecycleOwner, apiAddGoalData)
.
.
}
private val apiAddGoalData=Observer{response->
show零食(回应)
}
覆盖创建视图(
充气器:布局充气器,容器:视图组?,
savedInstanceState:捆绑?
):查看?{
.
.
viewModel.ApiadGoalData.observe(viewLifecycleOwner,ApiadGoalData)
.
.
}
现在,当我第一次进入时,它工作正常,但我第二次打开时,它会显示上一次的零食,如何在不创建新的ViewModel的情况下停止此操作?通过一种简单的方式,您可以在观察者的
onchange
方法中获取数据后,为MutableLiveData
设置空值。有关更多信息,请阅读本文:
. 您还可以看到这个问题可能对您有所帮助:我认为您的问题不在于LiveData,因为您明智地使用了viewLifecycleOwner,问题在于视图的状态和片段的生命周期。有了jetpack的导航组件,碎片会被替换到容器中。想象一下这个场景:您打开片段A,然后导航到FramentB并按back按钮返回片段A。片段A的onCreateView和onViewCreated方法再次被调用。由于在打开片段B时未调用片段A的onDestroy,一些视图状态将在返回到A时恢复。这与您可能知道我们使用viewLifecycleOwner的原因相同。因此,取消或清除片段A的onDestroyView中视图的状态:
recyclerView.setAdapter(null)
checkBox.setChecked(false)
您好,感谢您的详细描述,但我的问题是相反的,我从片段A到B,在B中加载一些数据,然后导航到片段A,然后当重新进入片段B时,我得到最新状态,这迫使我的视图使用不再有效的previuos数据更新它。。。但是,+1代表你的时间:)没问题。你所描述的与我所说的相似。你的问题只是第二个片段。它与LiveData和单视图模型设计无关。对于每个片段设计,我们也有一个Viewmodel的问题。您可以将livedata置为空,但是,应该从livedata获取状态的视图至少会显示前一状态一秒钟。例如,选中复选框,不将其保存到数据库,在返回到片段时,无论该复选框在数据库中的值是什么,都会首先选中该复选框。我同意这是最简单的方法,我甚至可以在每次片段打开时调用此viewModel.livedata=MutableLiveData(),但我想可能有更好的方法,所以我会仔细阅读你的链接。如果你得到了正确的答案,请选择我的答案作为最佳答案。
recyclerView.setAdapter(null)
checkBox.setChecked(false)