无法在 LiveData 中设置值

Posted

技术标签:

【中文标题】无法在 LiveData 中设置值【英文标题】:Unable to set value in LiveData 【发布时间】:2022-01-04 08:11:30 【问题描述】:

我无法为声明为MutableLiveDataLiveData 变量设置值。我试图设置的值是从存储库返回的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 当我尝试 '_tasks.value=taskRepository.getAllTask​​s().value ' 时,结果以 Unit 形式返回。【参考方案2】:

如果在某个后台线程中工作,则不能使用 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 变量无法正常工作

如何使用 LiveData 处理错误状态?

带有列表的 LiveData

将 LiveData 转换为 MutableLiveData

2021-08-13 解决协程调用LiveData异常后LiveData监听失效BUG

LiveData组件解析