如果快速按下按钮,导航到 DialogFragment 会产生 IllegalArgumentException 吗?

Navigating to DialogFragment produces IllegalArgumentException if button pressed quickly?

我的 Navigation 图有两个目的地,FragmentDialogFragmentFragment 包含一个 Button,在按下时导航到 DialogFragment

一切都按预期工作,除了 如果我非常快速地单击按钮。这样做可以触发一个

IllegalArgumentException: navigation destination com.example.app:id/show_dialog is unknown to this NavController

为了解决这个问题,我确保当前目的地是包含 show_dialog 操作的 Fragment

val navController = findNavController()
val currentDest = navController.currentDestination?.id

if (currentDest == R.id.test_fragment) {
    navController.navigate(TestFragmentDirections.showDialog())
}

进行此更改似乎可以解决问题。不过,我想知道:

Why is it necessary to wrap the navigate call with a conditional statement in this situation?

你的问题只是基于Android内部架构,也取决于硬件性能。只需将其包装在 try/catch 块中:

try{
  findNavController().navigate(TestFragmentDirections.showDialog())
}catch(e: IllegalArgumentException){
    e.printStackTrace
}

你可能会得到 因为如果你看到 showDialog() 方法,你会发现实现如下:

public void show(FragmentManager manager, String tag) {
    mDismissed = false;
    mShownByMe = true;
    FragmentTransaction ft = manager.beginTransaction();
    ft.add(this, tag);
    ft.commit();
}

我建议使用以下实现编写您自己的 showDialog 方法:

fragmentManager.beginTransaction()
               .add(dialog, "TAG")
               .commitAllowingStateLoss();