如何更改 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()