每当我在片段中调用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)
}
}
答案 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属性的等效名称,因此这些名称具有误导性,因为这些函数不会返回任何内容。