Kotlin,Android - 如何将 MutableLiveData<MutableList< Something >> 转换为 LiveData<List< Something >>

Kuc*_*uci 2 android list kotlin android-livedata mutablelist

MutableLiveData<MutableList<object>>在我拥有并且想要创建的ViewModel 中LiveData<List<object>>,但我不知道如何ListMutableList.

这是我想做的:

class AppViewModel : ViewModel() {

    private val _tasks = MutableLiveData<MutableList<Task>>(mutableListOf())
    val tasks: LiveData<List<Task>> = _tasks
}
Run Code Online (Sandbox Code Playgroud)

(但我收到错误类型不匹配。必需:LiveData<List> 发现:MutableLiveData<MutableList>

当我将其更改val tasks: LiveData<List<Task>> = _tasksval tasks: LiveData<MutableList<Task>> = _tasks它时,它可以工作,但我希望List任务中的任务不可编辑

Ten*_*r04 5

LiveData 是在 Java 中定义的,不存在声明站点差异。(如果它是在 Kotlin 中定义的,他们可能会使类型协变out以避免这个问题。)为了解决这个问题,您可以使用使用站点方差来使其协变:

val tasks: LiveData<out List<Task>> = _tasks
Run Code Online (Sandbox Code Playgroud)

协变意味着您无法从此引用修改其内容,这对于只读 LiveData 来说已经如此。这只是让编译器知道而已。将其标记为协变允许将 MutableList 类型向上转换为 List 类型。