【问题标题】:LiveData returns null value even though it contains a value即使 LiveData 包含一个值,它也会返回空值
【发布时间】:2020-11-09 08:17:29
【问题描述】:

我有以下代码:

class AddViewModel(application: Application) : AndroidViewModel(application) {

val readAllData: LiveData<List<DutyDay>>

private val repository: DutyDayRepository


init {
    val dutyDayDao = DutyDayDatabase.getDatabase(
        application
    ).dutyDayDao()

    repository = DutyDayRepository(dutyDayDao)
    readAllData = repository.readAllData

    val date = readAllData.value?.get(1)?.date
}

如您所见,readAllData 是一个 dutyDay 类型的 LiveData 列表。 我正在从 Room 数据库中获取数据,并且这个数据库不是空的,我在我的 recyclerView 中使用它,一切正常。

但是当我尝试从 readAllData 列表的索引 1 中的 dutyDay 对象(代码示例的最后一行)中检索日期时,该变量在调试时包含 null,而它在数据库中显然不是 null,如图所示在回收站视图中? (在示例中不可见)...

我做错了什么?

感谢您的帮助:-)

【问题讨论】:

    标签: kotlin android-room android-livedata


    【解决方案1】:

    因为 LiveData 是一个生命周期感知组件,它不会加载任何数据,直到它有观察它的东西

    因此,当它被加载到您的 recyclerView 中时,您会观察/订阅它,因此一旦数据库具有该值,它将更新 livedata,并且您也会在 get() 调用中收到该值

    但是这里发生的是你的 get() 调用正在寻找你的 livedata 对象的最后一个值,由于没有被观察到,它是 null

    【讨论】:

    • 我在滥用我的MediatorLiveData 时总是遇到这种情况。也许我应该停止这样做:)
    • @Joozd 我的首选方法是使用 2 个变量,一个“私有 val _mutableData:MutableLiveData = MutableLiveData()”,我用于在视图模型中进行更新,然后是“val nonMutableData:LiveData = _mutableData",我使用此变量在视图中进行观察,这意味着我可以愉快地更新视图模型中的 _mutableData 而无需将 setValue() 方法暴露给视图(大喊评论格式:P)
    猜你喜欢
    • 2021-02-08
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多