Android 具有初始值的可变LiveData
如何使用初始值初始化MutableLiveData? 我要找的东西是:Android 具有初始值的可变LiveData,android,kotlin,android-livedata,Android,Kotlin,Android Livedata,如何使用初始值初始化MutableLiveData? 我要找的东西是: val text=MutableLiveData(“初始值”)同样如此 val data = MutableLiveData<String>() data.value = "data" val text = MutableLiveData<String>().apply { "apply" } Log.d("Data",text.value)
val text=MutableLiveData(“初始值”)
同样如此
val data = MutableLiveData<String>()
data.value = "data"
val text = MutableLiveData<String>().apply {
"apply"
}
Log.d("Data",text.value)
val data=MutableLiveData()
data.value=“数据”
val text=MutableLiveData()。应用{
“应用”
}
Log.d(“数据”,text.value)
最后,我意识到我可以使用
val text=MutableLiveData()。应用{postValue(“初始值”)}
(postValue
在从后台线程使用时是必需的,否则在从主线程使用时,您可以安全地使用value=“initial value”
)您可以创建一个方便的工具来为您进行初始化
fun <T : Any?> MutableLiveData<T>.default(initialValue: T) = apply { setValue(initialValue) }
val liveData = MutableLiveData<String>().default("Initial value!")
fun MutableLiveData.default(initialValue:T)=apply{setValue(initialValue)}
val liveData=MutableLiveData().default(“初始值!”)
MutableLiveData
已经更新,现在它有一个接受初始值的构造函数:)
据我所见,构造函数从以下版本开始可用:
implementation'androidx.lifecycle:lifecycle extensions:2.1.0-alpha01'
遗憾的是,他们没有更新MediatorLiveData
来反映这一点
,现在您可以在中实际看到新的构造函数。您可以创建一个扩展构造函数(sugar trick),如下所示:
fun <T : Any?> MutableLiveData(defaultValue: T) = MutableLiveData<T>().apply { setValue(defaultValue) }
fun MutableLiveData(defaultValue:T)=MutableLiveData().apply{setValue(defaultValue)}
使用:
var defaultValue: MutableLiveData<String> = MutableLiveData("Default value")
var-defaultValue:MutableLiveData=MutableLiveData(“默认值”)
虽然这是一个有争议的问题,但我认为如果我也为它提供Java版本可能会有所帮助
在使用androidx时依赖项:
implementation "androidx.lifecycle:lifecycle-viewmodel:2.1.0"
implementation 'android.arch.lifecycle:viewmodel:1.1.1'
使用构造函数初始化MutableLiveData
,如下所示
new MutableLiveData<>("Initial value");
MutableLiveData<String> text = MutableLiveData<String>();
text.setValue("Initial value");
初始化如下
new MutableLiveData<>("Initial value");
MutableLiveData<String> text = MutableLiveData<String>();
text.setValue("Initial value");
MutableLiveData text=MutableLiveData();
text.setValue(“初始值”);
androidx
依赖项确实具有构造函数,该构造函数为LiveData
的初始化获取一个值。然而,如果您使用的是android
依赖项,您将没有使用构造函数进行初始化的选项。如果您希望在MutableLiveData
中传递一些默认值,我有一个更好的解决方案。如果您使用的是kotlin,则有一个名为observeProperty
的类这可以帮助您传递MutableLiveData的默认值
val nameLiveData = MutableLiveData<String>()
var name: String by Delegates.observable("") { _, _, newValue ->
nameLiveData.postValue(newValue)
}
您所要做的就是更改该值,它将发布在您的LiveData中。您可以在ViewModel中使用setValue。这与设置初始值不同。如果从工作线程执行此操作,则可以轻松创建竞争条件。在postValue(…)之后读取值不能保证为您提供发布的值,因为setValue(…)将在不同的线程上运行。您还可以创建一个半构造函数fun MutableLiveData(initialValue:T)=MutableLiveData()。应用{postValue(initialValue)}
使其更方便(当您确定此方法只能从主线程调用时,请使用setValue
)我使用此扩展函数有一段时间了,今天我将其更改为fun LD.default(initialValue:T)=apply{setValue(initialValue)}
启用它在任何扩展MutableLiveData
的类上的使用,例如MediatorLiveData
。这仍然正确吗?查看文档,我没有看到接受任何参数的公共构造函数:@Noel此更改未包含在稳定版本中,这就是为什么在那里看不到它。如果添加依赖项并打开e类你会看到新的构造函数。我认为这不再有效。2.1.0-alpha01版本对我来说没有给我另一个constructor@KlitosG.,因此您现在可以在文档中实际看到构造函数:@_Static_assert Nope,但是有一个名为NonNullableMutableLiveData
(它实际上已经在一个补丁中提到了),而且自己编写一个也不是很难:``类NonNullableLiveData(initialValue:T):MutableLiveData(initialValue){override fun getValue():T=super.getValue()!!}```