具有初始值的 MutableLiveData

MutableLiveData with initial value

如何用初始值初始化 Mu​​tableLiveData? 我正在寻找类似的东西:

val text = MutableLiveData<String>("initial value")

也是这样..

    val data = MutableLiveData<String>()
    data.value = "data"
    val text = MutableLiveData<String>().apply {
        "apply"
    }
    Log.d("Data",text.value)

终于知道可以用了

val text = MutableLiveData<String>().apply { postValue("initial value")}

(从后台线程使用时需要postValue,否则从主线程使用时你可以安全地使用value = "initial value")

您可以创建一个方便的 Extension Function 来为您进行初始化。

fun <T : Any?> MutableLiveData<T>.default(initialValue: T) = apply { setValue(initialValue) }

val liveData = MutableLiveData<String>().default("Initial value!")

MutableLiveData 已更新,现在它有一个接受初始值的构造函数:)

据我所知,构造函数从这个版本开始可用:

implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0-alpha01'

遗憾的是他们还没有更新 MediatorLiveData 来反映这一点。


2.1.0 is finally stable, so now you can actually see the new constructor in the documentation.

您可以像这样创建一个扩展构造函数(糖招):

fun <T : Any?> MutableLiveData(defaultValue: T) = MutableLiveData<T>().apply { setValue(defaultValue) }

使用:

var defaultValue: MutableLiveData<String> = MutableLiveData("Default 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 依赖项,您将无法选择使用构造函数进行初始化。

如果你想在你的 MutableLiveData<T> 中传递一些默认值,我有一个更好的解决方案如果你使用的是 kotlin,那么有一个名为 ObservableProperty<T>class 可以帮助你为你的 MutableLiveData.Here 的我的实现传递默认值。

val nameLiveData = MutableLiveData<String>()
var name: String by Delegates.observable("") { _, _, newValue ->
    nameLiveData.postValue(newValue)
}

在您的 ActivityFragment 中观察此 属性。

viewModel.nameLiveData.observe(this, Observer {
        //Your logic goes here
    })

您只需更改值即可 name = "Joe" 它会发布在您的 LiveData

我会这样做:

val text by lazy { MutableLiveData<String>("Initial text") }

这样,您就可以使用 kotlin 中的 lazy 并设置默认值。或者像这样更短:

val text by lazy { MutableLiveData<>("Initial text") }