如何在ViewModel中改变MutableLiveData的值。

问题描述 投票:0回答:1

我需要在我的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)
        }
    }
}

音频记录道

@Dao
interface AudioRecordDao {
    @Query("SELECT * FROM AudioRecordEmpty")
    fun getAll(): LiveData<MutableList<AudioRecordEmpty>>
}
android kotlin viewmodel android-livedata
1个回答
2
投票

首先,使用 !! 不是一个好主意,它很容易导致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
        }
})

千万不要在FragmentActivity里面设置你的LiveData

如果你需要更新你的LiveData。

mViewModel.onSomethingHappened()

在ViewModel里面

fun onSomethingHappened() {
  ...
  ...
  ...
  mLiveData.value = NEW_VALUE
}

如果你想从另一个线程更新你的LiveData,请使用。

mLiveData.postValue()
© www.soinside.com 2019 - 2024. All rights reserved.