使用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() 动态嵌套路由,同时维护整个导航堆栈?
经过一些研究,我注意到您可以通过在 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),
);
},
),
我认为
context.replace
会完成你正在尝试做的事情,因为它应该替换当前堆栈上的内容。
因此,只有当路由嵌套(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()
。但这会导致过渡动画出现问题。
我使用了以下方法,阅读 context.go 方法的文档字符串有很大帮助
context.pushReplacement(url);