Мой вопрос: почему они сделали это так?
Поскольку Google, очевидно, нравится писать больше кода ради написания большего количества кода.
Предполагаемое ответьте, если вы склонны верить им, что LiveData<Event<T>>
предпочтительнее, чем SingleLiveData
, потому что они придумали его позже, чем LiveData<Event<T>>
и, следовательно, предположительно лучше .
Они намереваются использовать «очередь событийной шины, которая забывает элементы после того, как она была отправлена хотя бы одному наблюдателю», но Jetpack не предлагает такой концепции «из коробки», лично Мне пришлось написать одну из своих,
Несмотря на это, существует различие между тем, можете ли вы писать во что-то, и можете ли вы только читать из чего-то, но не писать в это самостоятельно. В этом случае только ViewModel хочет иметь возможность отправлять события, поэтому именно ViewModel содержит ссылку Mutable__
, но предоставляет обычный LiveData
для внешнего мира (в моем случае, EventEmitter
против EventSource
).
Что касается _
, то это стиль Kotlin, который, мы надеемся, однажды изменится, как вы могли бы сделать:
private val _openLink = MutableLiveData<Event<String>>()
val openLink: LiveData<Event<String>>
get() = _openLink
Но вы также можете do
private val openLink = MutableLiveData<Event<String>>()
fun openLink(): LiveData<Event<String>> = openLink
И таким образом мы могли бы отказаться от префикса _
в нашем собственном коде, но по какой-то причине авторы Kotlin не придумали это соглашение вовремя.