在 Kotlin 的 Stateflow 上使用映射

alf*_*tap 18 android viewmodel kotlin android-livedata kotlin-stateflow

通过 Viewmodel 中的 LiveData,我们可以像这样使用 switchMap 或 Transformations.map

val recipesList = cuisineType.switchMap { repository.getDisplayRecipes(it.cuisineType).asLiveData() }
Run Code Online (Sandbox Code Playgroud)

使用 StateFlow 实现此目的的最佳方法是什么?我知道我们可以像下面一样使用地图,但是这会返回 Flow<Flow<List<Recipe>>> ,这似乎不正确

val recipeListFlow = cuisineTypeStateFlow.map {
    repository.getDisplayRecipes(it.cuisineType)
}
Run Code Online (Sandbox Code Playgroud)

Epi*_*rce 1

应该

val recipeListFlow = cuisineTypeStateFlow.flatMapLatest {
    repository.getDisplayRecipes(it.cuisineType)
}
Run Code Online (Sandbox Code Playgroud)

  • 如果我理解正确的话,这解决了“map”发出过时值的问题,但转换后您仍然遇到冷流? (2认同)