gpt4 book ai didi

android - popUpTo 似乎在导航组件中不起作用

转载 作者:行者123 更新时间:2023-12-03 13:45:44 48 4
gpt4 key购买 nike

所以我正在使用android导航组件并且我有一个问题(2.2.0-rc04版本)。

我有一个 welcomeFragment (WF)。来自 wF我想导航到 loginSellerFragment (lSF) 在不同的导航图中。我也不想删除 wF导航到 lSF 时从 backstack (popUpTo, popUpToInclusive)因为用户可能想回到它。

<fragment
android:id="@+id/welcomeFragment">
<action
android:id="@+id/action_welcomeFragment_to_nav_onboarding_seller"
app:launchSingleTop="true"
app:destination="@id/nav_onboarding_seller" />
</fragment>

导航到 lSF 后,backstack 看起来像这样: wF lSF

我们在 lSF现在,登录后我们想去 feedFragment (fF) 再次出现在单独的图表中,但这次我们要清除所有后台堆栈,因为如果用户登录并按下返回,他希望应用程序退出,而不是让他回到 wF。或 lSF ,所以我使用了 popUpTo="@id/loginSellerFragment popUpToInclusive='true"lSF 的行动中至 fF .
<fragment
android:id="@+id/loginSellerFragment">
<action
android:id="@+id/action_login_to_seller"
app:destination="@+id/seller" . //this is the graph that has as firstDestination, feedFragment
app:launchSingleTop="true"
app:popUpTo="@id/loginSellerFragment"
app:popUpToInclusive="true" />
</fragment>

所以此时在backstack中应该只有 fF 因为我们删除了直到 lSF 的所有内容( lSF 包括在内)

问题

当我在 fF然后按回,应用程序不会关闭,而是将我带到 wF ( wF 应该已经从后台弹出了)

我试过的

我试过而不是 popUpTo="@id/loginSellerFragment popUpToInclusive='true"使用 popUpTo="@id/welcomeFragment popUpToInclusive='true"它工作得很好,但我很确定这不是应该这样做的。我在这里想念什么?我是否建立了错误的后台?

我也试过添加 popUpTo="@id/welcomeFragment popUpToInclusive='true"wF 导航后至 lSF ,但这会破坏我的用户体验,因为我不希望应用程序在我仍在登录过程中时退出。

请注意,所有这些 fragment 都在单独的图表中。
要导航,我使用 FragmentDirections例如: findNavController.navigate(WelcomeFramgentDirections.actionXtoY())

最佳答案

在使用 popUpTo 时,要掌握 Navigation Component 如何操作 backstack 并不容易。选项。
您在问题中提到的解决方案是正确的:
你确实应该使用 popUpTo="@id/welcomeFragment" popUpToInclusive="true"而不是 popUpTo="@id/loginSellerFragment" popUpToInclusive="true" .
我将尝试解释原因。

  • 当你启动你的应用程序时,你的 backstack 将是空的并且 welcomeFragment将显示。
  • 当您从 welcomeFragment 导航时至loginSellerFragment ,您将拥有 welcomeFragment在你的后台。
  • 如果您登录,您将从 loginSellerFragment 导航至feedFragment ,在后台你将有 loginSellerFragmentwelcomeFragment .

  • 由于您使用了 popUpTo="@id/welcomeFragment" ,应用程序将开始从您的后台弹出(删除) fragment ,直到它到达 welcomeFragment . welcomeFragment由于我们使用了 popUpToInclusive="true",因此也将被删除.
    Backstack 的行为应该类似于 FILO(先进后出)堆栈,因此它将以这种方式删除 fragment :
    首先将删除顶部 fragment ,即 loginSellerFragment .
    接下来, welcomeFragment将是顶部 fragment 。因为我们需要弹出 fragment ,直到我们到达 welcomeFragment这是我们停止的地方,但是 welcomeFragment也会因为 popUpToInclusive="true" 而被删除你的后台将是空的。
    如果您尝试从 welcomeFragment 导航返回,您将退出应用程序,因为您的后台堆栈为空。
    我希望这个对你有用。您还可以阅读有关堆栈数据结构的更多信息。

    关于android - popUpTo 似乎在导航组件中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59856693/

    48 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com