【问题标题】:Kotlin, Android - How to transform MutableLiveData<MutableList< something >> to LiveData<List< something >>Kotlin,Android - 如何将 MutableLiveData<MutableList< something >> 转换为 LiveData<List< something >>
【发布时间】:2021-04-09 16:15:50
【问题描述】:

在 ViewModel 中我有 MutableLiveData&lt;MutableList&lt;object&gt;&gt;,我想创建 LiveData&lt;List&lt;object&gt;&gt;,但我不知道如何从 MutableList 创建 List

这是我想要做的:

class AppViewModel : ViewModel() {

    private val _tasks = MutableLiveData<MutableList<Task>>(mutableListOf())
    val tasks: LiveData<List<Task>> = _tasks
}

(但我收到错误类型不匹配。必需:LiveData 找到:MutableLiveData

当我将val tasks: LiveData&lt;List&lt;Task&gt;&gt; = _tasks 更改为val tasks: LiveData&lt;MutableList&lt;Task&gt;&gt; = _tasks 时,它可以工作,但我希望任务中的List 不可编辑

【问题讨论】:

    标签: android list kotlin android-livedata mutablelist


    【解决方案1】:

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

    val tasks: LiveData<out List<Task>> = _tasks
    

    协变意味着您不能从此引用修改其内容,这对于只读 LiveData 已经是正确的。这只是让编译器知道它。将其标记为协变允许将 MutableList 类型向上转换为 List 类型。

    【讨论】:

    • 谢谢,您的解决方案让我摆脱了错误 :-) 太好了!
    • 跟进问题 :-)... 我正在使用 dataBinding... 但看起来我无法在 ViewModel 之外访问这样的列表中的项目(我认为它可以从任何地方访问) :tasks.value.get(index) 等。 value 选项不存在,然后是错误...
    • 对不起,我从来没有使用过数据绑定。
    • 好的。非常感谢您提供的解决方案:-)
    猜你喜欢
    • 1970-01-01
    • 2018-11-29
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    相关资源
    最近更新 更多