android 具有初始值的可变实时数据

83qze16e  于 2023-03-11  发布在  Android
关注(0)|答案(8)|浏览(222)

我如何用初始值初始化MutableLiveData?我正在寻找类似于:
val text = MutableLiveData<String>("initial value")

cl25kdpy

cl25kdpy1#

MutableLiveData已更新,现在它有一个接受初始值的构造函数:)
据我所知,从这个版本开始就可以使用构造函数:
implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0-alpha01'
不过,很遗憾他们没有更新MediatorLiveData来反映这一点。
编辑:他们终于做到了!MediatorLiveData有一个构造函数,它也接受从2.6.0开始的初始值!
2.1.0终于稳定了,所以现在您实际上可以在文档中看到新的构造函数。

polkgigr

polkgigr2#

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

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

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

ljsrvy3e3#

**更新:**现在我会使用MutableStateFlow,而不是带有初始值的MutableLiveData

https://developer.android.com/kotlin/flow/stateflow-and-sharedflow
最后,我意识到我可以用
val text = MutableLiveData<String>().apply { postValue("initial value")}

  • (从后台线程使用时,postValue是必需的,否则从主线程使用时,您可以安全地使用value = "initial value")*
pw9qyyiw

pw9qyyiw4#

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

2guxujil

2guxujil5#

你可以像这样创建一个扩展构造函数(sugar trick):

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

使用:

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

kg7wmglp6#

还有这样...

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

brccelvz7#

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

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中

tkqqtvp1

tkqqtvp18#

我会这样做:

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

这样,您就使用了Kotlin的lazy并设置了默认值。或者更短,如下所示:

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

相关问题