Android LiveData多Fragment观察异常:仅一个Fragment可响应UI更新
问题分析与解决方案
核心问题出在ViewModel的作用域上:你现在用by viewModels()给每个Fragment创建的是Fragment专属的ViewModel实例,三个Fragment的DataModel根本不是同一个对象。所以只有FragmentB对应的ViewModel里的clientDevices LiveData会更新,另外两个Fragment观察的是自己独立ViewModel里的LiveData,自然收不到通知。
解决步骤
把三个Fragment中获取ViewModel的代码从:
private val vm: DataModel by viewModels()
改成:
private val vm: DataModel by activityViewModels()
activityViewModels()会让Fragment获取Activity作用域的ViewModel实例,这样三个Fragment共享同一个DataModel对象,当clientDevices LiveData更新时,所有Fragment的观察者都会收到回调。
修改后的代码示例(以FragmentC为例)
class FileListFragment: Fragment() { // 改为activityViewModels()共享Activity作用域的ViewModel private val vm: DataModel by activityViewModels() private lateinit var binding: FileListBinding override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { binding=FileListBinding.inflate(inflater, container, false) return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) vm.clientDevices.observe(viewLifecycleOwner, Observer{ Toast.makeText(context, "OKKK", Toast.LENGTH_SHORT).show() }) } }
同样把FragmentA和FragmentB的by viewModels()也改成by activityViewModels(),就能解决只有FragmentB能响应LiveData更新的问题。
内容的提问来源于stack exchange,提问作者Nyein Kyaw Zin
相关产品推荐
相关产品推荐

