簡體   English   中英

MutableLiveData 不通知觀察者

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM