如何在ViewModel中返回MutableLiveData类型HashMap并解决类型不匹配报错
问题根因
你声明的latestMessageMapdata是包裹了HashMap的MutableLiveData对象,不是HashMap本身,没有HashMap对应的[]索引运算符重载,所以编译器找不到符合类型的get方法,才会误匹配到文本处理相关的MatchGroupCollection.get方法,抛出类型不匹配的错误。
修复步骤
- 第一步:先通过
latestMessageMapdata.value拿到它包裹的HashMap实例,如果实例未初始化需要先创建 - 第二步:修改HashMap里对应的键值对
- 第三步:调用
postValue方法通知LiveData数据发生变更,触发所有观察者更新
代码修改示例
把你onChildChanged、onChildAdded回调里的错误代码:
latestMessageMapdata[dataSnapshot.key!!]?.postValue(it)
替换为下面的代码即可:
dataSnapshot.getValue(ChatMessage::class.java)?.let { chatMsg -> val key = dataSnapshot.key ?: return@let // 先获取LiveData包裹的HashMap,为空则新建实例 val currentMap = latestMessageMapdata.value ?: hashMapOf() // 更新HashMap内容 currentMap[key] = chatMsg // 把修改后的HashMap回传给LiveData,触发更新 latestMessageMapdata.postValue(currentMap) }
额外注意事项
- 不要修改HashMap内容后不调用LiveData的
postValue/setValue,否则LiveData感知不到数据变化,不会通知UI更新 - 主线程操作可以用
setValue,子线程操作固定用postValue即可 - 建议提前初始化
latestMessageMapdata减少空判断逻辑,可以在ViewModel的init块中添加初始化代码:
init { latestMessageMapdata = MutableLiveData(hashMapOf()) }
内容的提问来源于stack exchange,提问作者ramya
相关产品推荐
相关产品推荐

