Kotlin的可空性和LiveData

我想将LiveData与Kotlin一起使用,并且其值不应为null。 你怎么处理这个? 也许LiveData的包装? 在这里寻找好的模式..作为一个例子:

class NetworkDefinitionProvider : MutableLiveData() { val allDefinitions = mutableListOf(RinkebyNetworkDefinition(), MainnetNetworkDefinition(), RopstenNetworkDefinition()) init { value = allDefinitions.first() } fun setCurrent(value: NetworkDefinition) { setValue(value) } } 

我知道访问时值不会为空 – 但我总是要检查null或者让这些丑陋!

    我创建了一个扩展属性。 它不是非常漂亮,但它非常简单。

     val  LiveData.valueNN get() = this.value!! 

    用法

     spinner.loading = myLiveData.valueNN.homeState.loading 

    我没有附加“NN”作为一个很好的命名约定,但这超出了问题的范围:)

    我不知道这是否是最佳解决方案,但这是我想出的以及我使用的内容:

     class NonNullLiveData(private val defaultValue: T) : MutableLiveData() { override fun getValue(): T = super.getValue() ?: defaultValue fun observe(owner: LifecycleOwner, body: (T) -> Unit) { observe(owner, Observer { body(it ?: defaultValue) }) } } 

    创建字段:

     val string = NonNullLiveData("") 

    观察它:

     viewModel.string.observe(this) { // Do someting with the data } 

    我很少改进回答幸运编码器。 此实现根本不接受空值。

     class NonNullMutableLiveData(initValue: T): MutableLiveData() { init { value = initValue } override fun getValue(): T { return super.getValue()!! } override fun setValue(value: T) { super.setValue(value) } fun observe(owner: LifecycleOwner, body: (T) -> Unit) { observe(owner, Observer { t -> body(t!!) }) } override fun postValue(value: T) { super.postValue(value) } } 

    您可以为LifecycleOwner创建扩展

     fun  LifecycleOwner.observe(liveData: LiveData, lambda: (T) -> Unit) { liveData.observe(this, Observer { if (it != null) lambda(it) }) } 

    然后在你的片段/活动中

     observe(liveData) { ... } 

    你可以这样做

     normalLiveData .nonNull() .observe(this, { result -> // result is non null now }) 

    有一篇关于它的文章。 https://medium.com/@henrytao/nonnull-livedata-with-kotlin-extension-26963ffd0333