You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在StateFlow中修改UiState的dialogText为null且保留data?

实现closeDialog方法修改StateFlow状态的方案

原有的uiState是通过stateIn创建的只读StateFlow,无法直接修改内部状态。要实现关闭对话框且保留数据的需求,需要将状态管理改为基于MutableStateFlow,同时兼顾Repository的数据更新和本地UI操作的状态调整。

1. 重构状态持有方式

将只读StateFlow替换为内部可变、外部只读的状态容器:

private val _uiState = MutableStateFlow<BusStopsDBScreenUiState>(BusStopsDBScreenUiState.Loading)
val uiState: StateFlow<BusStopsDBScreenUiState> = _uiState.asStateFlow()

2. 初始化时绑定Repository数据流

在ViewModel初始化块中,收集Repository返回的数据流并更新内部状态:

init {
    viewModelScope.launch {
        busDataRepository.getBusStops()
            .map<List<BusStop>, BusStopsDBScreenUiState> { busStops ->
                BusStopsDBScreenUiState.Success(busStops, Res.string.bus_stops_db_filled)
            }
            .catch { throwable ->
                emit(BusStopsDBScreenUiState.Error(throwable))
            }
            .collect { newState ->
                _uiState.value = newState
            }
    }
}

3. 实现closeDialog方法

通过copy方法创建新的Success状态实例,保留原有data并将dialogText设为null:

fun closeDialog() {
    val currentState = _uiState.value
    if (currentState is BusStopsDBScreenUiState.Success) {
        _uiState.value = currentState.copy(dialogText = null)
    }
}

可选:简化updateBusStops方法

移除不必要的嵌套协程,直接在IO调度器执行数据更新:

fun updateBusStops() {
    viewModelScope.launch(Dispatchers.IO) {
        busDataRepository.updateBusStops()
    }
}

内容的提问来源于stack exchange,提问作者NullPointerException

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 15:12:38