Android Fragments 为什么popbackstack会从片段中删除action/destination?

e3bfsja2  于 2023-03-18  发布在  Android
关注(0)|答案(1)|浏览(205)

我正在构建一个notes应用程序,基本上是keep notes的克隆,我想在用户从createNotesFragment按下back按钮时保存笔记,并从堆栈中弹出片段以移回homeFragment。

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        requireActivity()
            .onBackPressedDispatcher
            .addCallback(this) {
                saveNote()
                activity?.supportFragmentManager?.popBackStack()
            }
    }

从homeFragmet的导航工作正常,但当我试图移回createNotesFragment时添加了一个音符后,它向我显示了这个错误。

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.lavanianotesapp, PID: 7351
    java.lang.IllegalArgumentException: Navigation action/destination com.example.lavanianotesapp:id/action_homeFragment_to_createNotesFragment cannot be found from the current destination Destination(com.example.lavanianotesapp:id/createNotesFragment) label=fragment_create_notes class=com.example.lavanianotesapp.UI.Fragments.CreateNotesFragment
        at androidx.navigation.NavController.navigate(NavController.kt:1540)

我不明白在弹出BackStack之前它工作正常,但在弹出片段之后它就不工作了。
先谢了。

lo8azlld

lo8azlld1#

在为一位客户开发聊天应用程序时,我找到了自己问题的答案。
navController在currentDestination没有找到导航的原因是因为它在弹出堆栈后不知何故没有更新currentDestination,它仍然认为currentDestination是createNotesFragment,并且由于没有从createNotesFragment移动到相同creatNotesFragment的操作,它显示了错误。创建NavController的扩展函数,如下所示:

fun NavController.navigateSafely(

    @IdRes resId : Int,
    args : Bundle ? = null,
    navOptions : NavOptions? = null,
    navExtras : Navigator.Extras? = null

){

    val action = currentDestination?.getAction(resId) ?: graph.getAction(resId)
    if(action!=null && currentDestination?.id != action.destinationId){
    navigate(resId,args,navOptions,navExtras)
}

}

用法:

findNavController.navigateSafely(//Pass id)

相关问题