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
相关产品推荐
相关产品推荐

