如何更改 ViewModel 中的 MutableLiveData 值
How change MutableLiveData value inside ViewModel
我需要在我的 ViewModel 中更改 MutableLiveData 的值,但我做不到,因为该值等于 null,我认为需要建立一个观察者在其中更改它,但我不知道如何去做,是否是个好主意。
AudioRecordersListViewModel
class AudioRecordersListViewModel() : ViewModel() {
var audioRecordsLiveData: MutableLiveData<MutableList<AudioRecordUI>> = MutableLiveData();
private var audioRecordDao: AudioRecordDao? = null
@Inject
constructor(audioRecordDao: AudioRecordDao) : this() {
this.audioRecordDao = audioRecordDao
viewModelScope.launch {
val liveDataItems = audioRecordDao
.getAll().value!!.map { item -> AudioRecordUI(item) }
.toMutableList()
if (liveDataItems.size > 0) {
liveDataItems[0].isActive = true
}
audioRecordsLiveData.postValue(liveDataItems)
}
}
}
AudioRecordDao
@Dao
interface AudioRecordDao {
@Query("SELECT * FROM AudioRecordEmpty")
fun getAll(): LiveData<MutableList<AudioRecordEmpty>>
}
首先,使用!!
不是一个好主意,它很容易导致NullPointer Exception,我们改用?
。
您可以在 LiveData 上设置一个空列表并向该列表添加新数据:
var audioRecordsLiveData: MutableLiveData<MutableList<AudioRecordUI>> = MutableLiveData();
init {
audioRecordsLiveData.value = mutableListOf()
}
如果需要观察那个LiveData:
mViewModel.mLiveData.observe(this, Observer { list ->
if (list.isNotEmpty()) {
//Update UI Stuff
}
})
切勿在 Fragment/Activity
中设置您的 LiveData
如果您需要更新 LiveData:
mViewModel.onSomethingHappened()
内部视图模型:
fun onSomethingHappened() {
...
...
...
mLiveData.value = NEW_VALUE
}
如果您想从另一个线程更新您的 LiveData,请使用:
mLiveData.postValue()
我需要在我的 ViewModel 中更改 MutableLiveData 的值,但我做不到,因为该值等于 null,我认为需要建立一个观察者在其中更改它,但我不知道如何去做,是否是个好主意。
AudioRecordersListViewModel
class AudioRecordersListViewModel() : ViewModel() {
var audioRecordsLiveData: MutableLiveData<MutableList<AudioRecordUI>> = MutableLiveData();
private var audioRecordDao: AudioRecordDao? = null
@Inject
constructor(audioRecordDao: AudioRecordDao) : this() {
this.audioRecordDao = audioRecordDao
viewModelScope.launch {
val liveDataItems = audioRecordDao
.getAll().value!!.map { item -> AudioRecordUI(item) }
.toMutableList()
if (liveDataItems.size > 0) {
liveDataItems[0].isActive = true
}
audioRecordsLiveData.postValue(liveDataItems)
}
}
}
AudioRecordDao
@Dao
interface AudioRecordDao {
@Query("SELECT * FROM AudioRecordEmpty")
fun getAll(): LiveData<MutableList<AudioRecordEmpty>>
}
首先,使用!!
不是一个好主意,它很容易导致NullPointer Exception,我们改用?
。
您可以在 LiveData 上设置一个空列表并向该列表添加新数据:
var audioRecordsLiveData: MutableLiveData<MutableList<AudioRecordUI>> = MutableLiveData();
init {
audioRecordsLiveData.value = mutableListOf()
}
如果需要观察那个LiveData:
mViewModel.mLiveData.observe(this, Observer { list ->
if (list.isNotEmpty()) {
//Update UI Stuff
}
})
切勿在 Fragment/Activity
中设置您的 LiveData如果您需要更新 LiveData:
mViewModel.onSomethingHappened()
内部视图模型:
fun onSomethingHappened() {
...
...
...
mLiveData.value = NEW_VALUE
}
如果您想从另一个线程更新您的 LiveData,请使用:
mLiveData.postValue()