LiveData到StateFlow / SharedFlow的转换



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)

switchMapflows中被弃用,应该使用flatMap,transformtransformLatest中的任何一个来将一种类型的流转换为其他类型的流。例如

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

我猜你可以对StateFlowSharedFlows使用相同的逻辑。

相关内容

  • 没有找到相关文章

最新更新