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

ViewModel中switchMap生成的LiveData在try catch内无法赋值如何解决

错误原因

你代码中movies是switchMap操作符返回的只读LiveData实例,LiveData的value属性的setter是protected修饰的,只有它的子类MutableLiveData才公开了可写入的setter,因此你在catch块中执行movies.value = listOf()尝试直接给只读LiveData赋值,就会触发该报错。

解决方案

你完全不需要手动给movies赋值,它的值由绑定的currentQuery自动触发switchMap逻辑更新,按以下两步修改即可:

  1. 删除catch块中movies.value = listOf()这行多余的赋值代码
  2. 给switchMap内部的搜索逻辑加上异常捕获,避免搜索请求出错时崩溃,修改后的movies定义代码如下:
// 把var改成val,不需要修改movies的引用
val movies = currentQuery.switchMap { queryString ->
    liveData {
        try {
            emit(repository.getSearchResults(queryString))
        } catch (e: Exception) {
            // 搜索出错时直接返回空列表即可
            emit(emptyList())
        }
    }
}

这样修改后,不管是分类接口请求出错,还是搜索接口请求出错,都不会再出现报错,搜索结果的异常已经在switchMap内部自行处理了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:15:03