#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, вы потеряете представление / фрагмент…