SharedFlow не будет передавать значение подписчику во фрагменте (сбор)
Я хочу использовать
SharedFlow
вместо того
StateFlow
потому что первый не требует начального значения
ViewModel :
val photosPaginData = photoRepository.getPhotosPagingData() // Flow<PagingData<Photo>>
.cachedIn(viewModelScope)
.shareIn(viewModelScope, SharingStarted.Eagerly)
Фрагмент :
viewLifecycleOwner.lifecycleScope.launchWhenStarted {
viewModel.photosPaginData.collect { pagingData ->
photosAdapter.submitData(pagingData) // no calls here...
}
}
Я только пытаюсь использовать его в первый раз, поэтому мб, я не совсем понимаю, как это работает.
Он отлично работает, если я заменю
shareIn
с участием
stateIn
и установить в качестве начального значения (третий параметр), но затем в
collect
обратный звонок мне нужно проверить, не так ли
null
перед отправкой в адаптер
Обновлено
Кажется, что если значения выдаются до того, как SharedFlow был запущен, новые подписчики не получат последнее значение.
Так что мне нужно изменить
shareIn(viewModelScope, SharingStarted.Eagerly)
к
shareIn(viewModelScope, SharingStarted.WhileSubscribed())
или чтобы
shareIn(viewModelScope, SharingStarted.Eagerly, replay = 1)
заставить это работать
Но какой лучше? Мне просто нужно сохранить один и тот же экземпляр
PagingData
1 ответ
Я рекомендую не использовать
SharingStarted.Eagerly
, так как он никогда не отменит восходящий поток, даже если наблюдающая активность/фрагмент больше не наблюдает.
Совет для приложений Android! В большинстве случаев можно использовать WhileSubscribed(5000), чтобы восходящий поток оставался активным еще 5 секунд после исчезновения последнего сборщика.