flutter [go_router] 具有默认弹出功能的

chy5wohz  于 6个月前  发布在  Flutter
关注(0)|答案(7)|浏览(57)

使用案例

当直接访问应该像 /about/changelog 等那样被推送的根路由(例如在浏览器中按 F5)时,由于没有可以弹出的路由,因此不会有 BackButton。支持在堆栈后面添加路由的功能将非常方便,这样它就不会是:[ '/changelog' ],而是 [ '/' , '/changelog' ]

建议

GoRoute(
  path: '/changelog',
  defaultPopTo: '/', // will pop to '/' if the navigator cannot pop
)

在后台,这将向页面堆栈添加 / 页面,从而使 BackButton 出现在脚手架中。

5ktev3wc

5ktev3wc1#

你是如何访问这些路由的?

  • 如果你通过推送方式访问它们,你应该有 BackButton ,因为你的堆栈包含你的上一个路由。
  • 如果你通过 go 或从深度链接访问它们,也许你应该将这些路由嵌套在你期望的“弹出默认路由”中:
GoRoute(
  path: '/',
  routes: [
    GoRoute(path: 'about'),
    GoRoute(path: 'changelog'),
  ]
)

这应该符合你的预期。

ftf50wuq

ftf50wuq2#

以下是更详细的解释:
在我们的应用程序中,我们有 /account-dashboard-seller/account-dashboard-customer。用户可以在卖家或客户模式之间切换。在两个帐户 Jmeter 板页面上,当我们按下“关于”时,会推送 /about 页面。
虽然这在只有一个帐户 Jmeter 板的情况下起作用:

GoRoute(
  path: '/account-dashboard',
  routes: [
    GoRoute(path: 'about'),
  ]
)

你可以有

GoRoute(
  path: '/account-dashboard-seller',
  routes: [
    GoRoute(path: 'about'),
  ]
)
//
GoRoute(
  path: '/account-dashboard-customer',
  routes: [
    GoRoute(path: 'about'),
  ]
)

但我们的要求是将 /about 作为顶级页面,因为它不需要保护其他路由(未经身份验证的用户可以访问它)。
出于这个原因,我们没有使用上面的方法,而是简单地将 /about 等放在顶级位置,并添加了 BackButton 并手动处理,这对我们的使用场景有益。
所以尽管我们今天让它工作了,但也许这对其他人有用。

k2fxgqgv

k2fxgqgv3#

当你说 "当我们按下 '关于' 时,/about 页面被推送。" 时,你是使用 GoRouter.go 方法还是 GoRouter.push ?
因为如果你使用 GoRouter.push ,那么这个配置应该可以工作:

[
  GoRoute(path: '/account-dashboard-seller'),
  GoRoute(path: '/account-dashboard-customer'),
  GoRoute(path: '/about'),
]

例如,当你在

  1. /account-dashboard-seller 时,历史堆栈看起来像 [..., /account-dashboard-seller]
  2. 如果你从这个页面使用 GoRouter.push("/about") ,历史堆栈应该变为 [..., /account-dashboard-seller, /about]
  3. 并且当你使用 GoRouter.pop() 时,它应该回到 [..., /account-dashboard-seller]
    对于 [..., /account-dashboard-customer] 也有相同的情况。
    这种方法有问题吗?
j91ykkif

j91ykkif4#

@ValentinVignal,我们使用哪种方法并不重要。问题在于页面刷新时,而不是在导航之后。
因此,/about页面应该被推送,但用户可以按下F5并停留在/about上。因此,必须手动添加一个后退按钮。
除非你有像你之前所说的那样,让/about成为/的子元素。然而,这对我们来说行不通。

s4chpxco

s4chpxco5#

重新开放,因为回到它,我仍然相信这会有所帮助。更新原始文本以使其更清楚地表明问题的一部分是页面刷新

j8ag8udp

j8ag8udp6#

所以,/about页面是有意被推送的,但没有什么能阻止用户按下F5并卡在/about页面上。因此,必须手动添加一个后退按钮。
你确定按F5不能返回吗?当前的逻辑会将整个路由堆栈存储到浏览器历史记录中,即使它们是强制推送的。
此外,我认为你可以实现自己的backButton,它将调用context.go('/')。

zed5wv10

zed5wv107#

在网页上,用户可以输入一个URL并直接访问它。因此,在这里存储的任何内容都是无关紧要的。此外,我认为你可以实现自己的返回按钮,它将调用context.go('/')
确切地说,这就是这个问题所在。添加这些按钮(尽管并不需要太多努力)可能会更容易使用默认弹出窗口。这个问题是为了衡量对这种功能的兴趣,并看看这样的API是否可接受。
这里的想法是,你可以更控制(有效的)堆栈内的go路由器路由声明,而不是分散返回按钮。再次,这只是一个想法

相关问题