如何不使用下划线修改Jetpack Compose中State对象的值?
问题描述
在我的应用中,我向API发起请求,该API应返回布尔值。在ViewModel类中我定义了以下两个对象:
private val _isAvailableState = mutableStateOf<Response<Boolean>>(Success(false)) val isAvailableState: State<Response<Boolean>> = _isAvailableState
其中一个是可变状态,另一个是不可变状态。我通过以下方式修改其值:
fun checkAvailability() = viewModelScope.launch { repository.checkAvailability().collect { response -> _isAvailableState.value = response } }
请问有没有无需使用下划线的替代方案?我不想使用下划线命名。
替代方案
1. 明确命名私有可变状态
给私有可变状态加上mutable前缀,公开只读状态保持原有名称,既清晰区分又不用下划线:
// 私有可变状态 private val mutableIsAvailableState = mutableStateOf<Response<Boolean>>(Success(false)) // 公开只读状态,直接返回私有可变状态的只读接口 val isAvailableState: State<Response<Boolean>> get() = mutableIsAvailableState // 修改状态时直接操作私有可变状态 fun checkAvailability() = viewModelScope.launch { repository.checkAvailability().collect { response -> mutableIsAvailableState.value = response } }
2. 自定义委托封装状态逻辑
通过自定义委托类把可变状态的修改逻辑封装起来,外部只暴露只读的State接口,命名更规整:
// 自定义委托类,封装可变状态的读写逻辑 class MutableStateHolder<T>(initialValue: T) { private val mutableState = mutableStateOf(initialValue) val state: State<T> get() = mutableState fun setValue(value: T) { mutableState.value = value } } // 在ViewModel中使用 private val isAvailableHolder = MutableStateHolder<Response<Boolean>>(Success(false)) val isAvailableState: State<Response<Boolean>> get() = isAvailableHolder.state // 修改状态时调用委托的方法 fun checkAvailability() = viewModelScope.launch { repository.checkAvailability().collect { response -> isAvailableHolder.setValue(response) } }
3. 切换为StateFlow实现
如果项目中已经使用Flow,可以用MutableStateFlow配合asStateFlow()来暴露只读流,命名自然且符合Jetpack规范:
// 私有可变StateFlow private val isAvailableMutableFlow = MutableStateFlow<Response<Boolean>>(Success(false)) // 公开只读StateFlow,UI层可通过collectAsState()转为Compose State val isAvailableState: StateFlow<Response<Boolean>> = isAvailableMutableFlow.asStateFlow() // 修改状态时更新可变流的值 fun checkAvailability() = viewModelScope.launch { repository.checkAvailability().collect { response -> isAvailableMutableFlow.value = response } }
内容的提问来源于stack exchange,提问作者Always Learner
相关产品推荐
相关产品推荐

