Fragment无法接收共享ViewModel的LiveData更新问题求助
问题根因
- Koin提供的
by viewModel()注入方式默认以当前组件为ViewModel所有者:在Activity中调用时,生成的ViewModel实例绑定Activity生命周期;在Fragment中调用时,生成的ViewModel实例绑定当前Fragment自身的生命周期。当前写法会让Activity和Fragment拿到两个完全独立的RFIDTagViewModel实例,两者的数据互不连通。 - Activity更新的是自身持有ViewModel的LiveData,Fragment观察的是另一个独立实例的LiveData,自然收不到更新回调。
修复方案
修改Fragment中的ViewModel注入代码,将by viewModel()替换为Koin提供的by activityViewModel(),该方法会从Fragment的宿主Activity的ViewModelStore中获取已存在的ViewModel实例,保证Activity和Fragment共享同一个ViewModel对象:
class PickingItemFragment : Fragment() { // 仅需修改此行注入代码 private val rfidViewModel: RFIDTagViewModel by activityViewModel() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { rfidViewModel.rfidTagUUID.observe(viewLifecycleOwner, { tagUUID -> Timber.d("现在可以正常收到回调") }) // 原有返回布局逻辑保持不变即可 return inflater.inflate(R.layout.fragment_picking_item, container, false) } }
原有Koin配置、Activity代码、ViewModel代码均无需修改。
内容的提问来源于stack exchange,提问作者Cody
相关产品推荐
相关产品推荐

