StateFlow/SharedFlow中此实时数据转换的等效代码是什么?
val myLiveData: LiveData<MyLiveData> = Transformations
.switchMap(_query) {
if (it == null) {
AbsentLiveData.create()
} else {
repository.load()
}
基本上,我想听每一个查询的变化,以反应什么返回。所以,任何类似的使用StateFlow/SharedFlow是受欢迎的。
首先,创建一个helper扩展函数:
fun <R> Flow<R>.toStateFlow(coroutineScope: CoroutineScope, initialValue: R) = stateIn(coroutineScope, SharingStarted.Lazily, initialValue)
UsemapLatest{}
forTransformations.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()
forMediatorLiveData
:
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
使用相同的逻辑。