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

Kotlin StateFlow无法接收Result.Success状态排查求助

问题排查与修复

问题现象

一个REST API已返回200状态码和有效响应体,但对应的Flow始终停留在Loading状态,无法发射Success;另一个API则正常工作。

核心问题分析

1. Flow未发射数据(最关键)

在ServiceRepositoryImpl的getServiceTypes方法中,虽然成功调用API并完成了数据转换,但缺少emit()调用将结果发送到Flow中。上游Flow没有数据输出,导致asResult()无法收到Success状态,一直停留在Loading。

对比正常工作的getServices方法,它正确调用了emit(services)来发射数据,而getServiceTypes仅完成数据转换却未发射。

2. ViewModel中StateFlow初始值类型不匹配

serviceTypeUiState经过map转换后输出的是ServiceTypesUiState类型,但stateIn的initialValue设置为Result.Loading,类型不兼容,会导致编译错误或状态异常。

修复步骤

修复Repository中的Flow发射问题

修改ServiceRepositoryImpl的getServiceTypes方法,添加emit()发射转换后的数据:

override fun getServiceTypes(tokenFlow: Flow<String>): Flow<List<FilterableServiceType>> =
    flow {
        val token = tokenFlow.first().toString().toBearerToken()
        val serviceTypes = apiDataSource.getServiceTypes(token)
            .map(ServiceType::toResponse)
            .map(::FilterableServiceType)
        emit(serviceTypes) // 新增:发射转换后的数据
    }

修复ViewModel的初始值类型

将serviceTypeUiState的stateIn初始值改为ServiceTypesUiState.Loading,与转换后的类型一致:

val serviceTypeUiState = getServiceTypesUseCase()
    .asResult()
    .map { it: Result<List<FilterableServiceType>> ->
        println("Result state is : $it")
        when (it) {
            is Result.Error -> ServiceTypesUiState.Error(it.exception)
            is Result.Loading -> ServiceTypesUiState.Loading
            is Result.Success -> ServiceTypesUiState.Success(it.data)
        }
    }
    .stateIn(
        scope = viewModelScope,
        started = SharingStarted.WhileSubscribed(5000),
        initialValue = ServiceTypesUiState.Loading // 修改为正确的UI State类型
    )

额外检查点

  • 确认FilterableServiceType的转换逻辑正确,API返回的ServiceType能正确转换为ServiceTypeResponse再包装为FilterableServiceType。
  • 确保dataStoreManager.getUserToken()能正确发射token值,避免因token未就绪导致Flow挂起。

修复后验证

  1. 重新运行应用,查看println("Result state is : $it")的输出,应该能看到Result.Success状态。
  2. ServiceScreen中的serviceTypesUiState会切换为Success,FilterRow组件将正常显示服务类型选项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 12:27:34