Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 具有初始值的可变LiveData_Android_Kotlin_Android Livedata - Fatal编程技术网

Android 具有初始值的可变LiveData

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)

如何使用初始值初始化MutableLiveData? 我要找的东西是:

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()!!}```