如何在Fragment中监听DialogFragment的关闭事件?
问题分析
你当前遇到的核心问题是:MyFragment和DialogFragment获取的MyViewModel不是同一个实例。Koin的by viewModel()默认是为每个Fragment单独创建ViewModel实例,所以DialogFragment里更新的是自己的ViewModel,而MyFragment监听的是另一个独立的ViewModel实例,自然无法接收到状态更新。
解决方案
方案1:使用共享ViewModel(基于Koin)
将两个Fragment中的ViewModel获取方式改为绑定到Activity生命周期,这样就能共享同一个ViewModel实例:
修改MyFragment代码
private val myViewModel: MyViewModel by activityViewModel() // 替换原viewModel()为activityViewModel() btn1.setOnClickListener{ findNavController().navigate(R.id.my_dialog_fragment) } myViewModel.dialogFragmentIsClosed.observe(viewLifecycleOwner){isClosed-> if(isClosed) { // do something myViewModel.isDialogFragmentClosed(false) // 处理完后重置状态,避免重复触发 } }
修改DialogFragment代码
private val myViewModel: MyViewModel by activityViewModel() // 同样替换为activityViewModel() override fun onDismiss(dialog:DialogInterface){ myViewModel.isDialogFragmentClosed(true) // 这里无需再手动navigate回MyFragment,Dialog关闭后会自动回到上一个页面 // 移除这句:findNavController().navigate(R.id.my_fragment,bundle) }
方案2:使用Navigation返回结果API(更推荐)
Navigation组件原生支持页面间返回结果,无需依赖ViewModel,更符合组件设计规范:
在MyFragment中注册结果监听
btn1.setOnClickListener{ // 注册Dialog关闭的结果监听 findNavController().currentBackStackEntry?.savedStateHandle?.getLiveData<Boolean>("dialog_closed")?.observe(viewLifecycleOwner) { isClosed -> if(isClosed) { // do something } } findNavController().navigate(R.id.my_dialog_fragment) }
在DialogFragment的onDismiss中返回结果
override fun onDismiss(dialog: DialogInterface){ // 向上一个页面传递关闭状态 findNavController().previousBackStackEntry?.savedStateHandle?.set("dialog_closed", true) }
内容的提问来源于stack exchange,提问作者Alon Rech
相关产品推荐
相关产品推荐

