You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 09:45:36