【发布时间】:2018-12-20 15:44:33
【问题描述】:
如何使用初始值初始化 MutableLiveData? 我正在寻找类似的东西:
val text = MutableLiveData<String>("initial value")
【问题讨论】:
标签: android kotlin android-livedata
如何使用初始值初始化 MutableLiveData? 我正在寻找类似的东西:
val text = MutableLiveData<String>("initial value")
【问题讨论】:
标签: android kotlin android-livedata
MutableLiveData 已更新,现在它有一个接受初始值的构造函数:)
据我所知,从这个版本开始可以使用构造函数:
implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0-alpha01'
很遗憾,他们没有更新 MediatorLiveData 以反映这一点。
2.1.0 is finally stable,所以现在您实际上可以在documentation 中看到新的构造函数。
【讨论】:
2.1.0 is now finally stable,所以您现在实际上可以在文档中看到构造函数:developer.android.com/reference/androidx/lifecycle/…
NonNullableMutableLiveData 的 lint 检查(实际上在 latest release 的修复中提到过),而且自己写一个也不是很难:``` class NonNullableLiveData您可以创建一个方便的Extension Function 来为您进行初始化。
fun <T : Any?> MutableLiveData<T>.default(initialValue: T) = apply { setValue(initialValue) }
val liveData = MutableLiveData<String>().default("Initial value!")
【讨论】:
fun <T: Any?> MutableLiveData<T>(initialValue: T) = MutableLiveData().apply { postValue(initialValue) },让它更方便(当你确定这个方法只会从主线程调用时使用setValue)
fun <T : Any?, LD : MutableLiveData<T>> LD.default(initialValue: T) = apply { setValue(initialValue) },让它可以在任何扩展MutableLiveData的类上使用,例如MediatorLiveData.
我终于意识到我可以使用
val text = MutableLiveData<String>().apply { postValue("initial value")}
(在后台线程使用时需要postValue,否则从主线程使用时您可以安全地使用value = "initial value")
【讨论】:
虽然这是一个 Kotlin 问题,但如果我也为此提供 Java 版本可能会有所帮助。
在使用androidx 依赖时:
implementation "androidx.lifecycle:lifecycle-viewmodel:2.1.0"
使用构造函数初始化MutableLiveData,如下所示。
new MutableLiveData<>("Initial value");
使用android 依赖时:
implementation 'android.arch.lifecycle:viewmodel:1.1.1'
如下初始化。
MutableLiveData<String> text = MutableLiveData<String>();
text.setValue("Initial value");
androidx 依赖项确实有一个构造函数,该构造函数接受一个值来初始化您的LiveData。但是,如果您使用 android 依赖项,您将无法使用构造函数进行初始化。
【讨论】:
你可以像这样创建一个扩展构造函数(糖把戏):
fun <T : Any?> MutableLiveData(defaultValue: T) = MutableLiveData<T>().apply { setValue(defaultValue) }
使用:
var defaultValue: MutableLiveData<String> = MutableLiveData("Default value")
【讨论】:
也是这样..
val data = MutableLiveData<String>()
data.value = "data"
val text = MutableLiveData<String>().apply {
"apply"
}
Log.d("Data",text.value)
【讨论】:
如果您希望在 MutableLiveData<T> 中传递一些默认值,我有一个更好的解决方案如果您使用的是 kotlin,那么有一个名为 ObservableProperty<T> 的 class 可以帮助您传递 MutableLiveData 的默认值。这里是我的实现。
val nameLiveData = MutableLiveData<String>()
var name: String by Delegates.observable("") { _, _, newValue ->
nameLiveData.postValue(newValue)
}
在您的Activity 或Fragment 中观察此属性。
viewModel.nameLiveData.observe(this, Observer {
//Your logic goes here
})
您所要做的只是更改值name = "Joe",它将发布在您的 LiveData 中
【讨论】: