Android MutableLiveData продолжает излучать при повторном вводе фрагмента - PullRequest
2 голосов
/ 19 октября 2019

Я использую общую ViewModel в компоненте Navigation, а не создаю 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 ]

2 голосов
/ 19 октября 2019

Простым способом Вы можете установить нуль для вашего MutableLiveData после получения данных в onchange методе наблюдателя. Для получения дополнительной информации вы можете прочесть эту статью: сценарий с данными-событиями-навигацией и другими событиями-событиями-событиями . также вы можете увидеть, что этот вопрос может вам помочь: Как очистить сохраненное значение LiveData?

1 голос
/ 19 октября 2019

Я не думаю, что ваша проблема связана с LiveData, поскольку вы разумно используете viewLifecycleOwner, проблема связана с состоянием представления и жизненного цикла фрагмента. С навигационной составляющей реактивного ранца фрагменты заменяются в контейнере. Подумайте об этом сценарии: вы открываете фрагмент A, затем переходите к фрагменту B и нажимаете кнопку «назад», чтобы вернуться к фрагменту A. Методы onCreateView и onViewCreated фрагмента A вызываются снова. Поскольку onDestroy фрагмента A не был вызван при открытии фрагмента B, некоторые из состояний представления будут восстановлены при возврате к A. По этой же причине вы, возможно, знаете ту же причину, по которой мы используем viewLifecycleOwner. Поэтому обнулите или очистите состояние представлений в onDestroyView фрагмента A:

recyclerView.setAdapter(null)
checkBox.setChecked(false)
...