Go Router (Flutter)-推送完全相同的路由并刷新该路由

问题描述 投票:0回答:4

使用GoRouter,有没有办法用不同的参数推送完全相同的路由并使页面重新加载?我正在考虑类似 Navigator.pushReplacement

我正在使用 context.go('/my_page/?param={someID}') 推送到 MyPage (有状态小部件)

对该路由的初始推送工作正常,我加载了特定 ID 的页面

我尝试使用 context.go('/my_page/?param={ differentID}') 再次推送相同的路由(替换路由并使用不同的 ID 重新加载)。我的断点击中了 GoRoute pageBuilder 中的 return 语句,并且我还在 MyPage.build 中击中了断点。在构建中设置断点时,我看到传递到此小部件的新 ID。

但是页面不会在视觉上重建(或在 initState 中中断 - 旁注,初始化状态用于使用传入的 ID 加载几肘 - 页面是有状态小部件可能是问题吗?)

Material Page 上的维护状态为 false。另外,推动不同的路线也很好。

这是一个有状态小部件问题(意味着重新定位我所有的 cubit init 调用)吗?还是有不同的方式来推动同一条路线?

编辑_____________

这个问题特定于重建相同的路线,但我正在解决的更大问题是一遍又一遍地无限钻取同一页面,同时维护导航堆栈。

我使用状态管理器来保存路线列表,并通过使用 context.go() 来完全替换当前路线来触发导航。

有没有一种方法可以使用 context.push() 动态嵌套路由,同时维护整个导航堆栈?

flutter dart flutter-go-router
4个回答
19
投票

经过一些研究,我注意到您可以通过在 GoRoute() 的定义中使用

pageKey: UniqueKey()
重定向到同一页面。

我的项目中的示例代码:

GoRoute(
    path: RoutePaths.serviceDetail.value,
    name: RouteNames.serviceDetail.value,
    pageBuilder: (context, state) {
        return CustomTransitionPage<void>(
            key: UniqueKey(),
            child: const ServiceDetailPage(),
            transitionsBuilder: (context, animation, secondaryAnimation, child) =>
            PageTransitions.subpageTransition(animation, child),
        );
    },
),

2
投票

我认为

context.replace
会完成你正在尝试做的事情,因为它应该替换当前堆栈上的内容。


0
投票

因此,只有当路由嵌套(shell路由)并且您使用

context.pushNamed('route-name')
context.push('name')
推送新路由时,才会出现此问题。

您可以简单地使用以下代码片段等待子路由弹出。

onTap: () async {
  final bool? result = await context.push<bool>('/page2');
  if(result ?? false)...
  // TODO: here can be the refresh logic
}

go_router docs中提到了这一点。这不会重新启动该页面。 。如果您想在每次显示页面时重新启动该页面。答案将使用上面建议的

UniqueKey()
。但这会导致过渡动画出现问题。


0
投票

我使用了以下方法,阅读 context.go 方法的文档字符串有很大帮助

context.pushReplacement(url);
© www.soinside.com 2019 - 2024. All rights reserved.