Инициализация LiveData из объекта lateinit - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть следующий код

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 isобязательно инициализируется вызовом метода, а не внутри init.

1 Ответ

0 голосов
/ 01 декабря 2018

Есть способ сделать это с помощью `Transformations.switchMap.

Это похоже на то, как будто кто-то только что спросил, почему пистолет, направленный на их ногу, не стреляет.Это я говорю вам, что безопасность все еще включена, то, что вы делаете со своей ногой, это ваше дело.

По сути, у вас есть 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)

Возможно, вы захотите вернуть какой-нибудь Default или NullObject (например, AbsentLiveData из примеров AAC), если параметр switchMap равен null.

...