每当我调用片段中的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)
}
}
LiveData应存储在只读的val
属性中。您一直将读写var
属性指定为指向其他LiveData实例,因此您不会更新最初观察到的LiveData实例。
您确实需要将类型的属性设置为MutableLiveData
,以便实际更新它:
val notes = MutableLiveData<List<Note>>()
init {
getNotes()
}
NoteRepository中的函数应该返回List
s,而不是LiveData
s。
在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属性,因此这些名称具有误导性,因为函数不返回任何内容。