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

时间:2019-10-19 15:35:38

标签: android android-fragments android-livedata android-viewmodel

我在导航组件中使用共享的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?

2 个答案:

答案 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)