【问题标题】: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)。