Преобразование 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
.