How I can initialize MutableLiveData with initial value? I'm looking for something like:
val text = MutableLiveData<String>("initial value")
How I can initialize MutableLiveData with initial value? I'm looking for something like:
val text = MutableLiveData<String>("initial value")
MutableLiveData
has been updated and now it has a constructor that accepts an initial value :)
From what I can see, the constructor is available starting from this version:
implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0-alpha01'
It's a shame they haven't updated MediatorLiveData
to reflect that, though.
Edit: they finally did it! MediatorLiveData
has a constructor that accepts an initial value as well starting from 2.6.0
!
2.1.0
is finally stable, so now you can actually see the new constructor in the documentation.
You can create a handy Extension Function that does the initialization for you.
fun <T : Any?> MutableLiveData<T>.default(initialValue: T) = apply { setValue(initialValue) }
val liveData = MutableLiveData<String>().default("Initial value!")
UPDATE:
Nowadays I would use MutableStateFlow
instead of MutableLiveData
with initial value.
https://developer.android.com/kotlin/flow/stateflow-and-sharedflow
Finally, I realize that I can use
val text = MutableLiveData<String>().apply { postValue("initial value")}
(postValue
is necessary when using from a background thread, otherwise when using from the main thread you can safely use value = "initial value"
)
Though this is a Kotlin question, I though it might be helpful if I put the Java version for this as well.
While using androidx
dependency:
implementation "androidx.lifecycle:lifecycle-viewmodel:2.1.0"
Initialize the MutableLiveData
using the constructor as follows.
new MutableLiveData<>("Initial value");
While using the android
dependency:
implementation 'android.arch.lifecycle:viewmodel:1.1.1'
Initialize as follows.
MutableLiveData<String> text = MutableLiveData<String>();
text.setValue("Initial value");
The androidx
dependency does have the constructor that takes a value for the initialization of your LiveData
. However, if you are using the android
dependency you will not have that option of doing the initialization using the constructor.
You can create an extension constructor (sugar trick) like this:
fun <T : Any?> MutableLiveData(defaultValue: T) = MutableLiveData<T>().apply { setValue(defaultValue) }
Using:
var defaultValue: MutableLiveData<String> = MutableLiveData("Default value")
Also this way..
val data = MutableLiveData<String>()
data.value = "data"
val text = MutableLiveData<String>().apply {
"apply"
}
Log.d("Data",text.value)
I have a better solution if you want some default value to be passed in your MutableLiveData<T>
If you are using kotlin then there is a class
called ObservableProperty<T>
which can help you pass the default for your MutableLiveData.Here's my implementation.
val nameLiveData = MutableLiveData<String>()
var name: String by Delegates.observable("") { _, _, newValue ->
nameLiveData.postValue(newValue)
}
In your Activity
or Fragment
observe this property.
viewModel.nameLiveData.observe(this, Observer {
//Your logic goes here
})
All you have to do change the value is do name = "Joe"
and it will posted in your LiveData
I would do like this:
val text by lazy { MutableLiveData<String>("Initial text") }
This way, you are using lazy from kotlin and setting the default value. or even shorter like this:
val text by lazy { MutableLiveData<>("Initial text") }