我有以下代码
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
内部进行初始化。
答案 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)。