1

我正在尝试使用MutableLiveData数据库中的预填充值,但Observer始终返回nullbook. 我需要将其保留为MutableLiveData, NOT LiveData,因为我必须在某些地方以编程方式设置它。因此,我正在调用从数据库setValue中检索到的内容。LiveData代码:

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观察者为空吗?我认为当完成并检索值Observer时会收到通知。bookRep.getBookLiveData()感谢您的帮助。

4

1 回答 1

2

bookRep.getBookLiveData().getValue()总会回来null的。由于您null在 ViewModel 中设置一个值,如下所示:bookLiveData.setValue(null)在第 7 行,bookLiveData总是null在初始启动时。

您不能getValue()LiveData对象上使用在此处获取值,因为它在初始化时始终为空。您需要观察,以便在它实际发出值时得到通知。

有几种不同的方法可以解决它。一种方法是getBookLiveData()在 ViewModel 中观察 usingobserveForever()方法。

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。我不会在这里介绍它的实现,但我建议了解不同的方法并找到适合您需要的最佳方法。

于 2019-04-30T20:00:30.047 回答