Это странная ошибка, которую я имею, я начал думать, что наблюдатель моего фрагмента все еще наблюдает после того, как я обнаружил этот фрагмент.
Итак, у меня есть два фрагмента, которые используют одну и ту же модель представления, но они не делят его с действием, экземпляр viewmodel для каждого фрагмента
FragmentB ()
private val viewModel by viewModels<OrderViewModel> { VMOrderFactory(
OrderRepoImpl(
OrderDataSource()
)
) }
...
viewModel.fetchOrderStatus(trackingDetails.orderId).observe(viewLifecycleOwner, Observer { result -> ... }
Теперь я использую сопрограммы потока FragmentA () для хранения обновлений в реальном времени. на мой взгляд.
OrderViewModel
fun fetchOrderStatus(orderId: String) = liveData(Dispatchers.IO){
emit(Resource.Loading())
try{
repo.getOrderStatus(orderId).collect { status ->
emit(status)
}
}catch (e:Exception){
emit(Resource.Failure(e))
}
}
Теперь вот такая ситуация
Когда я нахожусь во FragmentA (), это работает и выбирает ордера.
Теперь, если я go на FragmentB()
и снова вернусь к FragmentA () и попытаюсь удалить из FragmentA()
с другим экземпляром этой модели представления и другим методом, fetchOrderStatus из FragmentB()
получит выполняется, и так как я извлек этот фрагмент, он возвращает nullPointerException
Итак, странно, что с viewLifeCycleOwner этот наблюдатель не отсоединяется от FragmentB () при возвращении к FragmentA (), и еще одна странная вещь заключается в том, что это просто происходит, когда Я быстро возвращаюсь от FragmentB () к FragmentA () и пытаюсь удалить ордер, но если я немного подожду (2 или 3 секунды, пока поток не присоединится и не запросит данные), это нормально работает
Что что может происходить и что происходит с моими наблюдателями?
FragmentA ()
Фрагмент A не использует метод fetchOrderStatus из FragmentB ()
private val viewModel by viewModels<OrderViewModel> { VMOrderFactory(
OrderRepoImpl(
OrderDataSource()
)
) }
viewModel.deleteOrder(adapter.getItem(position).orderId).observe(viewLifecycleOwner, Observer { result -> ... }
Ошибка сгенерирована здесь, но не о методе deleteOrder, а вместо этого из метода FragmentB () fetchOrderStatus, и это странно потому что в этот момент FragmentB () был извлечен, и его методы не должны извлекать какие-либо данные.
Может быть, мне нужно завершить поток при извлечении этого фрагментаB, но я делаю это в методе источника данных, когда он выбирает и поставляет с
awaitClose { subscription.remove() }