我尝试初始化我的 LiveData 对象,它给出了错误:“LiveData 是抽象的,它不能被实例化”
LiveData listLiveData = new LiveData<>();
我尝试初始化我的 LiveData 对象,它给出了错误:“LiveData 是抽象的,它不能被实例化”
LiveData listLiveData = new LiveData<>();
在 ViewModel 中,您可能想MutableLiveData
改用。
例如:
class MyViewModel extends ViewModel {
private MutableLiveData<String> data = new MutableLiveData<>();
public LiveData<String> getData() {
return data;
}
public void loadData() {
// Do some stuff to load the data... then
data.setValue("new data"); // Or use data.postValue()
}
}
或者,在 Kotlin 中:
class MyViewModel : ViewModel() {
private val _data = MutableLiveData<String>()
val data: LiveData<String> = _data
fun loadData() {
viewModelScope.launch {
val result = // ... execute some background tasks
_data.value = result
}
}
}
由于它是抽象的(正如@CommonsWare 所说),您需要将其扩展为子类,然后按照表单中的要求覆盖方法:
public class LiveDataSubClass extends LiveData<Location> {
}
有关更多详细信息,请参阅文档
我认为实现这一点的更好方法是使用我们所说的Backing Property来实现更好Encapsulation
的属性。
使用示例:
private val _userPoints = MutableLiveData<Int>()// used as a private member
val userPoints: LiveData<Int>
get() {
return _userPoints
} //used to access the value inside the UI controller (Fragment/Activity).
这样做维护了一个可编辑MutableLiveData
的类私有,ViewModel
而read-only
它的版本被维护为 a LiveData
,其中 agetter
返回原始值。
PS - 注意两个字段的命名约定,使用 (_)下划线。这不是强制性的,但建议这样做。
是的,你不能实例化它,因为它是一个抽象类。如果要在实时数据对象中设置值,可以尝试使用MutableLiveData 。如果您想观察其他 livedata 对象,也可以使用Mediator 实时数据。
您需要使用 MutableLiveData,然后将其转换为它的父类 LiveData。
公共类 MutableLiveData 扩展 LiveData
[MutableLiveData is] LiveData 公开了 setValue(T) 和 postValue(T) 方法。
你可以这样做:
fun initializeLiveData(foo: String): LiveData<String> {
return MutableLiveData<String>(foo)
}
那么你得到:
Log.d("now it is LiveData", initializeLiveData("bar").value.toString())
// prints "D/now it is LiveData: bar"