ViewModel не отсоединяет наблюдателя и не вызывает исключений - PullRequest
0 голосов
/ 12 апреля 2020

Это странная ошибка, которую я имею, я начал думать, что наблюдатель моего фрагмента все еще наблюдает после того, как я обнаружил этот фрагмент.

Итак, у меня есть два фрагмента, которые используют одну и ту же модель представления, но они не делят его с действием, экземпляр 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() }

1 Ответ

0 голосов
/ 12 апреля 2020

Если вы создаете ViewModel и предоставляете контекст Fragment, тогда ViewModel уничтожается, когда Fragment уничтожается. Если вы хотите, чтобы ViewModel пережил фрагменты, вам нужно запустить его с контекстом активности activityViewModel()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...