MutableLiveData 不通知观察者
MutableLiveData does not notify observer
我正在尝试将 MutableLiveData
与数据库中的预填充值一起使用,但 Observer
始终 returns 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
在观察者中为 null 吗?我认为 Observer
会在 bookRep.getBookLiveData()
完成并检索到值时收到通知。谢谢你的帮助。
bookRep.getBookLiveData().getValue()
将始终 return null
。由于您在 ViewModel 中设置了一个 null
值,如下所示:bookLiveData.setValue(null)
在第 7 行,bookLiveData
在初始启动时始终是 null
。
您不能在 LiveData
对象上使用 getValue()
来获取此处的值,因为它在初始化时始终为 null。您需要 observe 以便在它实际发出值时收到通知。
有几种不同的方法可以解决它。一种方法是使用 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。我不会在这里包括它的实现,但我建议您了解不同的方法并找到适合您需要的最佳方法。
我正在尝试将 MutableLiveData
与数据库中的预填充值一起使用,但 Observer
始终 returns 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
在观察者中为 null 吗?我认为 Observer
会在 bookRep.getBookLiveData()
完成并检索到值时收到通知。谢谢你的帮助。
bookRep.getBookLiveData().getValue()
将始终 return null
。由于您在 ViewModel 中设置了一个 null
值,如下所示:bookLiveData.setValue(null)
在第 7 行,bookLiveData
在初始启动时始终是 null
。
您不能在 LiveData
对象上使用 getValue()
来获取此处的值,因为它在初始化时始终为 null。您需要 observe 以便在它实际发出值时收到通知。
有几种不同的方法可以解决它。一种方法是使用 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。我不会在这里包括它的实现,但我建议您了解不同的方法并找到适合您需要的最佳方法。