观察者未触发

时间:2020-08-19 12:53:34

标签: android kotlin android-livedata

每当我在片段中调用getNotes()方法之一时,观察者就不会更新数据。但是更新是,如果我从主要片段转到其他片段,然后再次回到主要片段...

我不知道怎么了。在这里,我是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 个答案:

答案 0 :(得分:0)

LiveData应该存储在只读val属性中。您将继续分配您的读写var属性以指向其他LiveData实例,因此不会更新您最初观察的LiveData实例。

您确实需要将属性设置为MutableLiveData类型,以便您可以实际对其进行更新:

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

 init {
    getNotes()
 }

NoteRepository中的函数应该返回List,而不是LiveData<List>

在ViewModel中,当您从存储库中检索列表时,请将其分配给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 Bean或Kotlin属性的等效名称,因此这些名称具有误导性,因为这些函数不会返回任何内容。