[英]MutableLiveData does not notify observer
我試圖將MutableLiveData
與數據庫中的預填充值一起使用,但Observer
總是返回null
作為book
。 我需要將它保留為MutableLiveData
,而不是LiveData
,因為我必須在某些地方以編程方式設置它。 因此,我使用從數據庫中檢索到的LiveData
調用setValue
。 代碼:
ViewModel
:
private final MutableLiveData<Book> bookLiveData;
public MyViewModel(@NonNull Application application) {
super(application);
...
book = new MutableLiveData<>();
bookLiveData.setValue(bookRep.getBookLiveData().getValue());
....
}
Fragment
:
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
...
getActivity().getBookLiveData().observe(getViewLifecycleOwner(), book -> {
... // When fragment is created, book is always null here
});
}
有人能告訴我為什么觀察者中的Book
空嗎? 我認為當bookRep.getBookLiveData()
完成並檢索值時會通知Observer
。 感謝您的幫助。
bookRep.getBookLiveData().getValue()
將始終返回null
。 由於您在 ViewModel 中設置了一個null
值,如下所示: bookLiveData.setValue(null)
在第 7 行, bookLiveData
在初始啟動時始終為null
。
您不能在LiveData
對象上使用getValue()
來獲取此處的值,因為它在初始化時始終為 null。 您需要進行觀察,以便在它實際發出值時得到通知。
有幾種不同的方法可以解決它。 一種方法是使用observeForever()
方法在ViewModel 中觀察getBookLiveData()
。
private LiveData<Book> bookFromRep;
private MutableLiveData<Book> bookLiveData = new MutableLiveData<>();
private Observer<Book> bookObserver = bookLiveData::postValue; // Book observer posts value to bookLiveData.
public MyViewModel(@NonNull Application application) {
super(application);
...
bookFromRep = bookRep.getBookLiveData();
bookFromRep.observeForever(bookObserver);
....
}
@Override
protected void onCleared() {
super.onCleared();
// Don't forget to remove observer when you use observeForever()
bookFromRep.removeObserver(bookObserver);
}
解決此問題的另一種可以說是更好的方法是使用MediatorLiveData 。 我不會在這里包括它的實現,但我建議的是了解不同的方法並找到適合您需要的最佳方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.