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 секунд после исчезновения последнего сборщика.

Взято с: https://medium.com/androiddevelopers/things-to-know-about-flows-sharein-and-statein-operators-20e6ccb2bc74

Другие вопросы по тегам