Kotlin中如何基于Flow生成目标StateFlow?Code C是否可行?
问题解答
一、基于Flow类型的_listSortBy生成StateFlow<EResult<List<MInfo>>>的实现方式
你当前的Code B中,_listMInfo的类型是Flow<StateFlow<EResult<List<MInfo>>>>,原因是每次_listSortBy发射新值时,map操作都会创建一个新的StateFlow。要得到单一的StateFlow<EResult<List<MInfo>>>,需要使用**flatMapLatest**来切换数据源,再通过stateIn将最终流转换为StateFlow:
class RecordSoundViewModel @Inject constructor( ): ViewModel() { private val _listSortBy = MutableStateFlow(ESortBy.START_PRIORITY) // 最终类型为StateFlow<EResult<List<MInfo>>> val listMInfo: StateFlow<EResult<List<MInfo>>> = _listSortBy .flatMapLatest { sortBy -> handelMInfo.listAll(sortBy) } .stateIn( scope = viewModelScope, started = SharingStarted.WhileSubscribed(5000), // 5秒缓冲避免频繁销毁重建 initialValue = EResult.LOADING ) }
关键逻辑说明:
flatMapLatest:每当_listSortBy发射新的排序规则时,会立即取消之前的listAll流订阅,转而订阅新的listAll流,确保始终使用最新规则获取数据。stateIn:将合并后的冷流转换为热的StateFlow,指定作用域、启动策略和初始值,符合ViewModel中StateFlow的使用规范。
二、Code C的可行性分析
Code C完全不可行,当_listSortBy变化时,_listMInfo不会自动更新:
_listMInfo仅在ViewModel初始化时执行一次,传入的是_listSortBy.value的初始值。- 后续
_listSortBy的value发生变化时,不会触发handelMInfo.listAll()的重新调用,_listMInfo始终保持初始化时的Flow实例,无法响应排序规则的变更。
内容的提问来源于stack exchange,提问作者HelloCW
相关产品推荐
相关产品推荐

