Jetpack导航到公共目的地

13

我一直在使用Jetpack中的新导航API,但遇到了一个问题,无法找到令人满意的解决方案。

基本上,我正在创建的应用程序有大量不同的片段。大多数片段与后端通信,当它们这样做时,可以发现它们的会话已超时。发生这种情况时,我想跳转到登录片段。唯一的方法是为每个片段创建一个动作,将目标指向登录屏幕。这是很多重复代码,我宁愿避免。是否有更简单的方法来做到这一点?

2个回答

14

对于这种用例,您可以使用全局操作。要创建全局操作,请在导航图中选择所需的目标。右键单击,然后在菜单中选择“添加操作”,并单击“全局”,这将在您的导航图根元素内创建一个全局操作:

<action android:id="@+id/action_global_signInFragment" app:destination="@id/signInFragment"/>

现在您可以通过调用 navigation() 方法并传递所需全局操作的 ID 来使用全局操作:

NavHostFragment.findNavController(this).navigate(R.id.action_global_signInFragment)

https://developer.android.com/topic/libraries/architecture/navigation/navigation-global-action


4
如何进行争论? - roghayeh hosseini
如果给定的片段有参数,则全局操作的工作方式与常规操作相同。您可以在调用全局操作时提供参数。有关更多信息,请查看 https://developer.android.com/guide/navigation/navigation-pass-data - Olivér Raisz

0

我更倾向于发布另一种更适合传递参数和数据的方式:

  1. 检查在您的 build.gradle (app) 中使用这两个依赖项
  // Navigation Component
        implementation "androidx.navigation:navigation-fragment-ktx:$navigationVersion"
        implementation "androidx.navigation:navigation-ui-ktx:$navigationVersion"
  • 在nav_graph.xml中添加一个全局操作,可以像@Alex发布的那样添加,也可以右键单击您的片段并添加操作->全局,如下所示How to add Global Action

  • 现在,在要前往此目标的片段中,只需调用NavGraphDirections并找到您的全局操作,如下所示

  •      val action = NavGraphDirections.actionGlobalInternalLinkDispatcher()
                findNavController().navigate(action)
    

    actionGlobalInternalLinkDispatcher() 是我的全局目标操作,找到你的案例。
    如果您想添加参数并简单传递,可以在 nav_graph.xml 中添加您的参数,然后在此处传递您的适当参数,如下所示:
        val action = NavGraphDirections.actionGlobalInternalLinkDispatcher(myArgumentExample)
                findNavController().navigate(action)
    

    我建议在YouTube上观看这个视频,它会对你有所帮助 菜单和全局操作 - 使用导航组件入门 #6


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接