当我重新输入片段时,Android MutableLiveData会不断发出信号

当我重新输入片段时,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

我在导航组件中使用了一个共享的ViewModel,而不是为每个片段创建一个ViewModel(主要是因为它更容易),但是现在我遇到了一个问题,当我重新输入一个片段并订阅该片段的ViewModel实时数据时,我也得到了最后一个状态

以下是ViewModel代码:

  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)