在 Activity 中更改 LiveData 不会通知子片段中的观察者
Changing LiveData in Activity doesn't notify observer in child Fragment
我正在尝试更新 activity 中托管片段的 LiveData 对象,然后我想在观察片段后更新片段的 UI。问题是片段的 ui 仅在片段重新启动时更新。 activity中的数据每次变化时,如何实现fragment中Ui的实时更新?
// Activity 代码:
transactionViewModel = ViewModelProviders.of(this, providerFactory).get(TransactionViewModel.class);
transactionViewModel.getUserValues();
/// 片段:
transactionViewModel = ViewModelProviders.of(getActivity(), providerFactory).get(TransactionViewModel.class);
viewModel.userValues.observe(getActivity(), userValues -> { if(userValues.data != null){}//update the ui }
为了实现“Ui 的 real-time 更新”,我建议使用 data-binding。
在您的代码中,我认为您正在观察 viewModel 的不同引用。
在投射 activity 后尝试观察(我在这里使用的是 kotlin):
val myActivity = (requireActivity() as MainActivity)
myActivity.transactionViewModel.viewModel.userValues.observe(getActivity(), userValues -> {
if(userValues.data != null){}//update the ui }
片段代码
transactionViewModel = ViewModelProviders.of(getActivity(), providerFactory).get(TransactionViewModel.class);
viewModel.userValues.observe(getActivity(), userValues -> {
if(userValues.data != null) {
//update the UI
}
}
应该是
transactionViewModel = ViewModelProviders.of(getActivity(), providerFactory).get(TransactionViewModel.class);
// this goes in onViewCreated
viewModel.userValues.observe(viewLifecycleOwner, userValues -> {
if(userValues.data != null){
//update the ui
}
}
我正在尝试更新 activity 中托管片段的 LiveData 对象,然后我想在观察片段后更新片段的 UI。问题是片段的 ui 仅在片段重新启动时更新。 activity中的数据每次变化时,如何实现fragment中Ui的实时更新?
// Activity 代码:
transactionViewModel = ViewModelProviders.of(this, providerFactory).get(TransactionViewModel.class);
transactionViewModel.getUserValues();
/// 片段:
transactionViewModel = ViewModelProviders.of(getActivity(), providerFactory).get(TransactionViewModel.class);
viewModel.userValues.observe(getActivity(), userValues -> { if(userValues.data != null){}//update the ui }
为了实现“Ui 的 real-time 更新”,我建议使用 data-binding。
在您的代码中,我认为您正在观察 viewModel 的不同引用。
在投射 activity 后尝试观察(我在这里使用的是 kotlin):
val myActivity = (requireActivity() as MainActivity)
myActivity.transactionViewModel.viewModel.userValues.observe(getActivity(), userValues -> {
if(userValues.data != null){}//update the ui }
片段代码
transactionViewModel = ViewModelProviders.of(getActivity(), providerFactory).get(TransactionViewModel.class); viewModel.userValues.observe(getActivity(), userValues -> { if(userValues.data != null) { //update the UI } }
应该是
transactionViewModel = ViewModelProviders.of(getActivity(), providerFactory).get(TransactionViewModel.class);
// this goes in onViewCreated
viewModel.userValues.observe(viewLifecycleOwner, userValues -> {
if(userValues.data != null){
//update the ui
}
}