无法在 LiveData 中设置值
Posted
技术标签:
【中文标题】无法在 LiveData 中设置值【英文标题】:Unable to set value in LiveData 【发布时间】:2022-01-04 08:11:30 【问题描述】:我无法为声明为MutableLiveData
的LiveData
变量设置值。我试图设置的值是从存储库返回的LiveData
。
请在下面找到课程。
Viewmodel.class
// Variable to hold list of tasks Livedata
private val _tasks=MutableLiveData<List<TaskEntity>>()
val tasks:LiveData<List<TaskEntity>>
get() = _tasks
init
getTasksFromDb()
private fun getTasksFromDb()
viewModelScope.launch
try
_tasks.value=taskRepository.getAllTasks() // Showing error here
catch(exception:Exception)
Log.d(TAG,"Error "+exception.message)
存储库
class TaskRepository (val taskDb: TaskDatabase)
suspend fun insert(taskEntity: TaskEntity)=
taskDb.taskDao.insert(taskEntity)
fun update(taskEntity: TaskEntity)=
taskDb.taskDao.update(taskEntity)
fun delete(taskEntity: TaskEntity)=
taskDb.taskDao.delete(taskEntity)
fun getAllTasks():LiveData<List<TaskEntity>> =
taskDb.taskDao.getAllTasks()
道
@Dao
interface TaskDao
@Insert
fun insert(taskEntity: TaskEntity)
@Update
fun update(taskEntity: TaskEntity)
@Delete
fun delete(taskEntity: TaskEntity)
@Query("SELECT * FROM tasks")
fun getAllTasks():LiveData<List<TaskEntity>>
这里声明的变量以及我试图分配的值也是LiveData.Still
它给出了错误
Type mismatch:
Required : List<Entity>, Found: LiveData<List<Entity>>
有人可以帮我找出这里的问题吗?
【问题讨论】:
【参考方案1】:错误是不言自明的。它需要一个列表,但您正在尝试分配一个 LiveData。因此,例如,您可以像这样从 LiveData 中获取值:
_tasks.value=taskRepository.getAllTasks().value
这应该可以消除错误,尽管我不确定这是否是正确的实现
【讨论】:
但是我已经将 '_tasks' 设置为 MutableLiveData> ,那为什么它仍然显示Required is List如果在某个后台线程中工作,则不能使用 setValue。您必须在这里与一些观察者一起使用 postValue。
liveData.postValue("someNewData")
【讨论】:
【参考方案3】:首先 Livedata.value 需要一种 Livedata Generic
val liveData = MutableLiveData<Boolean>()
val liveDataTemp = MutableLiveData<Boolean>()
liveData.value = true //current
liveData.value = liveDataTemp //error
如果我目前了解您想要观察活动或片段中的所有任务。 以下代码可以帮助您。 视图模型
fun getAllTask():LiveData<List<TaskEntity>>()
return taskRepository.getAllTasks()
活动或片段
viewModel.getAllTask().observer(this)
list -> TODO()
【讨论】:
以上是关于无法在 LiveData 中设置值的主要内容,如果未能解决你的问题,请参考以下文章
将 LiveData 转换为 MutableLiveData