提问者:小点点

观察者未被触发


每当我调用片段中的getNotes()方法时,观察者不会更新数据。但是,如果我从mainfragment到其他fragment,然后再回到mainfragment,那么更新就是。。。

我不知道怎么了。这里我是livedata的新手,请帮忙

class MainViewModel  @ViewModelInject constructor(
    val repository: NoteRepository
): ViewModel() {
    
     var notes:  LiveData<List<Note>>



    init {
       
        notes= repository.getAllNotes()

    }
    fun getNotes(){
        notes = repository.getAllNotes()
    }
    fun getFavoriteNotes(){
        notes = repository.getAllNotesFavoriteOrder()
    }
    fun searchNotes(searchString:String){
        notes = repository.getAllNotesQueryTitle(searchString)
mainViewModel.notes.observe(viewLifecycleOwner){
            adapter.setData(it)
        }
class NoteRepository @Inject constructor (val noteDao: NoteDao) {



    suspend fun insertNote(note: Note){
        noteDao.insertNote(note)
    }

    fun getAllNotes():LiveData<List<Note>>{
        return noteDao.getAllNotes()
    }

    fun getAllNotesFavoriteOrder():LiveData<List<Note>>{
        return noteDao.getAllNotesFavoriteOrder()
    }
    fun getAllNotesQueryTitle(searchString : String) : LiveData<List<Note>> {
        return noteDao.getAllNotesQueryTitle(searchString)
    }
    suspend fun deleteAllNotes(){
        noteDao.deleteAllNotes()
    }
    suspend fun deleteNote(note: Note){
        noteDao.deleteNote(note)
    }
    suspend fun updateNote(note: Note){
        noteDao.updateNote(note)
    }

}

共1个答案

匿名用户

LiveData应存储在只读的val属性中。您一直将读写var属性指定为指向其他LiveData实例,因此您不会更新最初观察到的LiveData实例。

您确实需要将类型的属性设置为MutableLiveData,以便实际更新它:

 val notes = MutableLiveData<List<Note>>()

 init {
    getNotes()
 }

NoteRepository中的函数应该返回Lists,而不是LiveDatas。

在ViewModel中,当您从repo中检索列表时,将其分配给LiveData的value属性,例如:

fun getNotes(){
    notes.value = repository.getAllNotes()
}

更安全的模式是将MutableLiveData属性设置为私有,并公开它的公共LiveData版本,这样外部类就无法修改它:

 private val _notes = MutableLiveData<List<Note>>()
 val notes: LiveData<List<Note>> get() = _notes

 //...

 fun getNotes(){
     _notes.value = repository.getAllNotes()
 }

我建议将函数名getNotes()getFavoriteNotes()更改为类似于retrieveNotes()的内容。以get开头的函数名看起来像Java beans或等效的Kotlin属性,因此这些名称具有误导性,因为函数不返回任何内容。