具有初始值的 MutableLiveData

问题描述 投票:0回答:8

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

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

android kotlin android-livedata
8个回答
107
投票

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

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

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

很遗憾他们没有更新

MediatorLiveData
来反映这一点。

编辑:他们终于做到了!

MediatorLiveData
有一个构造函数,它也接受从
2.6.0
!

开始的初始值

2.1.0
终于稳定了,所以现在您实际上可以在文档中看到新的构造函数。


55
投票

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

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

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

45
投票

更新: 现在我会用

MutableStateFlow
代替
MutableLiveData
的初始值。

https://developer.android.com/kotlin/flow/stateflow-and-sharedflow


终于知道可以用了

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

(从后台线程使用时需要

postValue
,否则从主线程使用时您可以安全地使用
value = "initial value"


15
投票

虽然这是一个 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
依赖项,您将无法选择使用构造函数进行初始化。


3
投票

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

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

使用:

var defaultValue: MutableLiveData<String> = MutableLiveData("Default value")

2
投票

也是这样..

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

2
投票

如果你想在你的

MutableLiveData<T>
中传递一些默认值,我有一个更好的解决方案.

class

在您的

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

中观察此属性。


Activity

所有你需要做的改变价值是做

Fragment
它会发布在你的LiveData

我会这样做:


0
投票

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

name = "Joe"

© www.soinside.com 2019 - 2024. All rights reserved.