Kotlin,Android - 如何将 MutableLiveData<MutableList< something >> 转换为 LiveData<List< something >>
Kotlin, Android - How to transform MutableLiveData<MutableList< something >> to LiveData<List< something >>
在我有 MutableLiveData<MutableList<object>>
的 ViewModel 中,我想创建 LiveData<List<object>>
,但我不知道如何创建 List
来自 MutableList
.
这是我正在尝试做的事情:
class AppViewModel : ViewModel() {
private val _tasks = MutableLiveData<MutableList<Task>>(mutableListOf())
val tasks: LiveData<List<Task>> = _tasks
}
(但我收到错误 类型不匹配。需要:LiveData 找到:MutableLiveData
)
当我将 val tasks: LiveData<List<Task>> = _tasks
更改为 val tasks: LiveData<MutableList<Task>> = _tasks
时它起作用了,但我希望任务 中的 List
不可编辑。
LiveData 在 Java 中定义,其中没有声明站点差异。 (如果它是在 Kotlin 中定义的,他们可能会让类型协变 out
来避免这个问题。)为了解决这个问题,您可以使用 use-site variance 使其协变:
val tasks: LiveData<out List<Task>> = _tasks
协变意味着您无法从此引用修改其内容,这对于只读 LiveData 来说已经是正确的。这只是让编译器知道它。将其标记为协变允许将 MutableList 类型向上转换为 List 类型。
在我有 MutableLiveData<MutableList<object>>
的 ViewModel 中,我想创建 LiveData<List<object>>
,但我不知道如何创建 List
来自 MutableList
.
这是我正在尝试做的事情:
class AppViewModel : ViewModel() {
private val _tasks = MutableLiveData<MutableList<Task>>(mutableListOf())
val tasks: LiveData<List<Task>> = _tasks
}
(但我收到错误 类型不匹配。需要:LiveData 找到:MutableLiveData
)
当我将 val tasks: LiveData<List<Task>> = _tasks
更改为 val tasks: LiveData<MutableList<Task>> = _tasks
时它起作用了,但我希望任务 中的 List
不可编辑。
LiveData 在 Java 中定义,其中没有声明站点差异。 (如果它是在 Kotlin 中定义的,他们可能会让类型协变 out
来避免这个问题。)为了解决这个问题,您可以使用 use-site variance 使其协变:
val tasks: LiveData<out List<Task>> = _tasks
协变意味着您无法从此引用修改其内容,这对于只读 LiveData 来说已经是正确的。这只是让编译器知道它。将其标记为协变允许将 MutableList 类型向上转换为 List 类型。