我如何用初始值初始化MutableLiveData?我正在寻找类似于:val text = MutableLiveData<String>("initial value")
val text = MutableLiveData<String>("initial value")
cl25kdpy1#
MutableLiveData已更新,现在它有一个接受初始值的构造函数:)据我所知,从这个版本开始就可以使用构造函数:implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0-alpha01'不过,很遗憾他们没有更新MediatorLiveData来反映这一点。编辑:他们终于做到了!MediatorLiveData有一个构造函数,它也接受从2.6.0开始的初始值!2.1.0终于稳定了,所以现在您实际上可以在文档中看到新的构造函数。
MutableLiveData
implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0-alpha01'
MediatorLiveData
2.6.0
2.1.0
polkgigr2#
您可以创建一个方便的Extension Function来为您执行初始化。
fun <T : Any?> MutableLiveData<T>.default(initialValue: T) = apply { setValue(initialValue) } val liveData = MutableLiveData<String>().default("Initial value!")
ljsrvy3e3#
**更新:**现在我会使用MutableStateFlow,而不是带有初始值的MutableLiveData。
MutableStateFlow
https://developer.android.com/kotlin/flow/stateflow-and-sharedflow最后,我意识到我可以用val text = MutableLiveData<String>().apply { postValue("initial value")}
val text = MutableLiveData<String>().apply { postValue("initial value")}
postValue
value = "initial value"
pw9qyyiw4#
虽然这是一个Kotlin问题,但我认为如果我也把Java版本放在这里可能会有帮助。使用androidx依赖关系时:
androidx
implementation "androidx.lifecycle:lifecycle-viewmodel:2.1.0"
使用构造函数初始化MutableLiveData,如下所示。
new MutableLiveData<>("Initial value");
使用android依赖关系时:
android
implementation 'android.arch.lifecycle:viewmodel:1.1.1'
初始化如下。
MutableLiveData<String> text = MutableLiveData<String>(); text.setValue("Initial value");
androidx依赖项确实有一个构造函数,该构造函数接受LiveData初始化的值。但是,如果您使用的是android依赖项,则无法选择使用构造函数进行初始化。
LiveData
2guxujil5#
你可以像这样创建一个扩展构造函数(sugar trick):
fun <T : Any?> MutableLiveData(defaultValue: T) = MutableLiveData<T>().apply { setValue(defaultValue) }
使用:
var defaultValue: MutableLiveData<String> = MutableLiveData("Default value")
kg7wmglp6#
还有这样...
val data = MutableLiveData<String>() data.value = "data" val text = MutableLiveData<String>().apply { "apply" } Log.d("Data",text.value)
brccelvz7#
如果你想在MutableLiveData<T>中传递一些默认值,我有一个更好的解决方案,如果你使用Kotlin,那么有一个叫做ObservableProperty<T>的class,它可以帮助你传递MutableLiveData的默认值,这是我的实现。
MutableLiveData<T>
ObservableProperty<T>
class
val nameLiveData = MutableLiveData<String>() var name: String by Delegates.observable("") { _, _, newValue -> nameLiveData.postValue(newValue) }
在您的Activity或Fragment中观察此属性。
Activity
Fragment
viewModel.nameLiveData.observe(this, Observer { //Your logic goes here })
您所要做的更改值的操作是执行name = "Joe",它将发布在您的LiveData中
name = "Joe"
tkqqtvp18#
我会这样做:
val text by lazy { MutableLiveData<String>("Initial text") }
这样,您就使用了Kotlin的lazy并设置了默认值。或者更短,如下所示:
val text by lazy { MutableLiveData<>("Initial text") }
8条答案
按热度按时间cl25kdpy1#
MutableLiveData
已更新,现在它有一个接受初始值的构造函数:)据我所知,从这个版本开始就可以使用构造函数:
implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0-alpha01'
不过,很遗憾他们没有更新
MediatorLiveData
来反映这一点。编辑:他们终于做到了!
MediatorLiveData
有一个构造函数,它也接受从2.6.0
开始的初始值!2.1.0
终于稳定了,所以现在您实际上可以在文档中看到新的构造函数。polkgigr2#
您可以创建一个方便的Extension Function来为您执行初始化。
ljsrvy3e3#
**更新:**现在我会使用
MutableStateFlow
,而不是带有初始值的MutableLiveData
。https://developer.android.com/kotlin/flow/stateflow-and-sharedflow
最后,我意识到我可以用
val text = MutableLiveData<String>().apply { postValue("initial value")}
postValue
是必需的,否则从主线程使用时,您可以安全地使用value = "initial value"
)*pw9qyyiw4#
虽然这是一个Kotlin问题,但我认为如果我也把Java版本放在这里可能会有帮助。
使用
androidx
依赖关系时:使用构造函数初始化
MutableLiveData
,如下所示。使用
android
依赖关系时:初始化如下。
androidx
依赖项确实有一个构造函数,该构造函数接受LiveData
初始化的值。但是,如果您使用的是android
依赖项,则无法选择使用构造函数进行初始化。2guxujil5#
你可以像这样创建一个扩展构造函数(sugar trick):
使用:
kg7wmglp6#
还有这样...
brccelvz7#
如果你想在
MutableLiveData<T>
中传递一些默认值,我有一个更好的解决方案,如果你使用Kotlin,那么有一个叫做ObservableProperty<T>
的class
,它可以帮助你传递MutableLiveData的默认值,这是我的实现。在您的
Activity
或Fragment
中观察此属性。您所要做的更改值的操作是执行
name = "Joe"
,它将发布在您的LiveData中tkqqtvp18#
我会这样做:
这样,您就使用了Kotlin的lazy并设置了默认值。或者更短,如下所示: