Преобразование LiveData в StateFlow / SharedFlow

Каков эквивалентный код для этого преобразования данных в реальном времени в StateFlow / SharedFlow?

      val myLiveData: LiveData<MyLiveData> = Transformations
                    .switchMap(_query) {
                        if (it == null) {
                           AbsentLiveData.create()
                        } else {
                           repository.load()
                     }

По сути, я хочу прислушиваться к каждому изменению запроса, чтобы реагировать на то, что возвращать. Итак, все, что похоже на использование StateFlow / SharedFlow, приветствуется.

2 ответа

Сначала создайте вспомогательную функцию расширения:

      fun <R> Flow<R>.toStateFlow(coroutineScope: CoroutineScope, initialValue: R) = stateIn(coroutineScope, SharingStarted.Lazily, initialValue)

Использовать mapLatest{}за Transformations.map():

      val studentNames = _students.mapLatest { students ->
    students.map { "${it.name}" }
}.toStateFlow(uiScope, emptyList())    //uiScope is viewModelScope

Использовать flatMapLatest{}за Transformations.switchMap():

      val asteroids = _asteroidFilter.flatMapLatest { filter ->
    asteroidRepository.getAsteroidsFlow(filter)
}.toStateFlow(uiScope, emptyList())

Использовать combine()за MediatorLiveData:

      val sumScore = combine(_team1Score, _team2Score) { score1, score2 ->
    score1 + score2
}.toStateFlow(uiScope, 0)

switchMap устарело в flows и следует использовать любой из flatMap, transform или же transformLatestпреобразовывать одни типы потоков в другие. Примером для этого может быть

      val myFlow = flowOf<Int>().transform<Int, String> { flowOf("$it") }} 

Я думаю, вы можете использовать ту же логику для StateFlow или же SharedFlows.

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