如何组合多个StateFlow实现表单全局验证状态的同步监听
多字段表单整体校验StateFlow实现方案
问题背景
我在ViewModel类中定义了多个StateFlow字段,对应新增/编辑表单页面每个可输入字段的校验状态。我期望实现一个通用的表单校验类,对外暴露代表整份表单校验状态的StateFlow属性:当所有字段校验都通过时该属性发射true,任意字段校验不通过则发射false,初始代码框架如下:
class FormValidation(initValue: Boolean, vararg fieldIsValid: StateFlow<Boolean>) { private val _isValid = MutableStateFlow(initValue) val isValid: StateFlow<Boolean> = _isValid init { // 待实现:合并、订阅所有fieldIsValid流并同步状态 } }
我知道可以通过LiveData<Boolean>搭配MediatorLiveData实现该功能,但不清楚如何基于Flow完成逻辑开发,求可行实现方案。
已验证实现方案
以下实现基于社区方案优化,核心使用Flow的combine操作符合并所有字段校验流,只要有一个字段校验不通过,整体校验结果就为false:
class BooleanFlowMediator(scope: CoroutineScope, initValue: Boolean, vararg flows: Flow<Boolean>) { val sync: StateFlow<Boolean> = combine(*flows) { values -> values.all { it } }.stateIn(scope, SharingStarted.Eagerly, initValue) }
ViewModel结合使用演示
class SyncViewModel : ViewModel() { companion object { private const val DEFAULT_VALUE: Boolean = false } private val values: List<List<Boolean>> = listOf( listOf(false, false, false), listOf(true, false, false), listOf(false, true, true), listOf(true, true, true) ) private var index: Int = 0 private val _flow1 = MutableStateFlow(DEFAULT_VALUE) val flow1: StateFlow<Boolean> = _flow1 private val _flow2 = MutableStateFlow(DEFAULT_VALUE) val flow2: StateFlow<Boolean> = _flow2 private val _flow3 = MutableStateFlow(DEFAULT_VALUE) val flow3: StateFlow<Boolean> = _flow3 val mediator = BooleanFlowMediator(viewModelScope, DEFAULT_VALUE, flow1, flow2, flow3) fun generateValues() { val idx = (index + 1).mod(values.size).also { index = it } val row = values[idx] _flow1.value = row[0] _flow2.value = row[1] _flow3.value = row[2] } }
内容的提问来源于stack exchange,提问作者avvensis
相关产品推荐
相关产品推荐

