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

AlertDialog选择后LiveData Observer未触发,无法跳转Fragment

问题原因

核心问题是**SelectCharacterDialogFragment和WelcomeFragment持有的WelcomeViewModel不是同一个实例**:

  • WelcomeFragment通过by viewModels()获取的是绑定到自身的ViewModel实例
  • SelectCharacterDialogFragment同样用by viewModels()时,会创建一个属于自己的独立ViewModel实例

当你在Dialog中调用viewModel.setActivePlayerId()时,修改的是Dialog自身ViewModel里的_activePlayerId,而WelcomeFragment观察的是自己ViewModel里的playerId,自然不会触发观察者回调。

解决方案

修改SelectCharacterDialogFragment中获取ViewModel的方式,指定使用父Fragment(也就是WelcomeFragment)的ViewModel作用域:

@AndroidEntryPoint
class SelectCharacterDialogFragment : DialogFragment() {
    // 修改这里,使用父Fragment的ViewModel
    val viewModel: WelcomeViewModel by viewModels({ requireParentFragment() })

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        // 原有代码不变
        super.onCreateDialog(savedInstanceState)
        val names = arguments?.getStringArrayList("names")
        val ids = arguments?.getIntegerArrayList("ids")

        val dialogBuilder = MaterialAlertDialogBuilder(requireContext())
            .setTitle("Choose a character")
            .setItems(names!!.toTypedArray()) { dialog, which ->
                val playerId = ids?.get(which)
                Timber.d("Selected player id: %d", playerId)
                viewModel.setActivePlayerId(playerId!!)
            }
        return dialogBuilder.create()
    }
}
额外验证点
  • 确保SelectCharacterDialogFragment是由WelcomeFragment通过show(childFragmentManager, tag)启动的,这样requireParentFragment()才能正确指向WelcomeFragment
  • 你当前WelcomeFragment中使用viewLifecycleOwner注册观察者的写法是正确的,无需修改

内容的提问来源于stack exchange,提问作者twenty7

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 09:15:31