从lateinit对象初始化LiveData

时间:2018-11-30 22:26:49

标签: android kotlin android-room android-livedata

我有以下代码

lateinit var roomdb:RoomDb

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

您可能会期望我收到一个未初始化roomdb的异常。如何解决这个问题而又不至于太复杂呢?并且请在您的答复中考虑到我有多个依赖于roomdb的liveData字段,并且我不想为每个字段都做很多工作。

roomdb必须通过方法调用而不是在init内部进行初始化。

1 个答案:

答案 0 :(得分:0)

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

感觉就像是有人问为什么指向他们脚下的枪不开火。这是我告诉您安全仍在继续,您要做的事就是您的事。

基本上,您有一个LiveData,它将与对方的LiveData相提并论。

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

然后,在确保已设置_loadData.value = true之后,再设置roomdb

也许下面的方法更清洁一些?

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

_loadData.value = roomdb 

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

_loadData.postValue(roomdb)

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