【问题标题】:Initializing LiveData from lateinit object从 lateinit 对象初始化 LiveData
【发布时间】:2018-11-30 22:26:49
【问题描述】:

我有以下代码

lateinit var roomdb:RoomDb

val penLiveData:LiveData<Pen> = roomdb.getPen()
val paperLiveData:LiveData<Paper> = roomdb.getPaper()
val rulerLiveData:LiveData<Ruler> = roomdb.getRuler()
...

正如您所料,我收到了一个异常,即 roomdb 未初始化。如何在没有太多复杂性的情况下解决这个问题?请在您的回复中考虑到我有多个 liveData 字段,这些字段依赖于roomdb,我不想为每个字段做大量工作。

roomdb 必须由方法调用初始化,而不是在 init 内部。

【问题讨论】:

    标签: android kotlin android-room android-livedata


    【解决方案1】:

    有一种方法可以使用 `Transformations.switchMap。

    感觉有点像有人问为什么指着他们脚的枪不开火。这是我告诉你,安全仍在,你对你的脚做什么是你的事。

    基本上,您有一个 LiveData 可以让其他人获取/刷新。

    private val _loadData = MutableLiveData<Boolean>()
    val penLiveData = Transformations.switchMap(_loadData) { roomdb.getPen() }
    //...
    

    然后在确保设置了roomdb 之后设置_loadData.value = true

    也许下面的更干净一些?

    private val _loadData = MutableLiveData<RoomDb>()
    val penLiveData = Transformations.switchMap(_loadData) { it?.getPen() }
    //...
    

    _loadData.value = roomdb 
    

    或者,如果在异步上下文中。

    _loadData.postValue(roomdb)
    

    如果switchMap 参数为null,您可能希望返回一些 Default 或 NullObject(如 AAC 样本中的 AbsentLiveData)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 2022-12-15
      • 1970-01-01
      • 2020-12-31
      相关资源
      最近更新 更多