ViewModel中switchMap生成的LiveData在try catch内无法赋值如何解决
错误原因
你代码中movies是switchMap操作符返回的只读LiveData实例,LiveData的value属性的setter是protected修饰的,只有它的子类MutableLiveData才公开了可写入的setter,因此你在catch块中执行movies.value = listOf()尝试直接给只读LiveData赋值,就会触发该报错。
解决方案
你完全不需要手动给movies赋值,它的值由绑定的currentQuery自动触发switchMap逻辑更新,按以下两步修改即可:
- 删除catch块中
movies.value = listOf()这行多余的赋值代码 - 给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
相关产品推荐
相关产品推荐

