Kotlin安卓开发中MutableLiveData赋值出现类型不匹配错误求助
问题根因
你定义的_tasks是MutableLiveData<List<TaskEntity>>类型,它的value属性接收的是List<TaskEntity>类型的值,但你调用的taskRepository.getAllTasks()返回值是LiveData<List<TaskEntity>>类型,二者类型不匹配,因此抛出类型不匹配错误。
另外,Room DAO返回的LiveData本身自带数据库变更监听能力,当数据库内的任务数据变化时会自动推送新值,不需要额外封装一层MutableLiveData手动赋值。同时你在协程中调用无suspend修饰的getAllTasks()也没有必要,Room返回LiveData类型的查询方法会自动在后台线程执行查询,不需要手动放到协程中。
解决方案
方案1(推荐):直接复用Repository返回的LiveData
不需要额外封装MutableLiveData,直接持有Repository返回的LiveData即可,简化后的ViewModel代码如下:
class TaskViewModel(private val taskRepository: TaskRepository): ViewModel() { val tasks: LiveData<List<TaskEntity>> = taskRepository.getAllTasks() }
这种写法更简洁,且自动继承Room的监听能力,数据库数据变化时tasks会自动更新,无需手动触发查询赋值。
方案2:自行维护MutableLiveData
如果你需要对查询到的原始数据做二次处理再对外暴露,可以修改DAO、Repository的返回类型,直接返回列表数据:
- 修改DAO层查询方法:
@Dao interface TaskDao { // 其余方法保持不变 @Query("SELECT * FROM tasks") suspend fun getAllTasks(): List<TaskEntity> }
- 修改Repository层对应方法:
class TaskRepository (val taskDb: TaskDatabase){ // 其余方法保持不变 suspend fun getAllTasks(): List<TaskEntity> = taskDb.taskDao.getAllTasks() }
修改完成后你原来ViewModel中的赋值逻辑即可正常运行。
内容的提问来源于stack exchange,提问作者DroidBee
相关产品推荐
相关产品推荐

