Правильный способ обработки потока фрагмента в ViewModel

#android #kotlin #viewmodel #kotlin-coroutines #flow

#Android #kotlin #viewmodel #kotlin-сопрограммы #kotlin-flow

Вопрос:

У меня есть a Fragment с a ViewModel .

В у Fragment меня есть a View , который предоставляет поток сопрограммы, и я хочу обрабатывать коллекцию внутри ViewModel , и, очевидно, я не собираюсь ссылаться View на ViewModel .

Моя идея была в основном во фрагменте onViewCreated :

 view.flow
    .onEach(viewModel::collect)
    .launchIn(viewModel.viewModelScope)
 

Это работает, но … это хорошая реализация? Или есть лучший способ достичь моей цели?

Ответ №1:

Я полагаю, что вы можете использовать область действия стандартного фрагмента, а не viewmodelScope

viewLifecycleOwner.lifecycleScope от androidx.lifecycle:lifecycle-runtime-ktx:2.2.0 зависимости.

вот так

 view.flow
    .onEach(viewModel::collect)
    .launchIn(viewLifecycleOwner.lifecycleScope)
 

Комментарии:

1. Я думал об этом, но каждый из них является вспомогательным, и это означает, что приостановленный блок будет записан в модели представления, но фактически ограничен фрагментом, хотя на самом деле идея состояла бы в том, чтобы запустить его в области viewmodel (ofc я мог бы создать новую сопрограмму, но избегая этого)

2. ViewModel.collect можно приостановить, но вы можете запустить новую сопрограмму в viewmodel с областью viewmodel, если хотите, чтобы код внутри viewmodel выполнялся в viewmodelscope. Я боюсь, что если вы запустите поток представления в области viewmodel, вы потеряете представление / фрагмент…