【问题标题】:Unable to set value in LiveData无法在 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>>

有人可以帮我找出这里的问题吗?

【问题讨论】:

    标签: android kotlin android-room android-livedata


    【解决方案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()
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-24
        • 2021-10-11
        • 2018-10-06
        • 1970-01-01
        • 2021-09-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多