如何在路由过程之外访问GoRoute state.params



我希望一些简单的伪代码就足够了,这样我和您都可以理解这个问题和答案。当使用flutter web时,我面临的问题尤其困难,刷新会重新启动整个程序。我想使用路径参数在子窗口小部件构建方法中构建对象。

GoRouter(routes:...,GoRoute(path="/categories/:category/",
builder:(context,state){
category = state.params['category];
return ParentWidget(category);}
ParentWidget extends StatelessWidget {
build(context){
return ChildWidget();}}
ChildWidget extends StatlessWidget {
build(context){
return "do something with category";}}

现在,我可以想到的一种方法是,从技术上讲,应该在没有任何错误的情况下工作,那就是先将params传递到ParentWidget中,然后将其传递给下一个孩子,以此类推。但是,如果有一长串的孩子小部件,它会变得非常乏味,我猜也很容易出错。我想的另一件事是使用提供者:再次将param传递给父小部件,然后让父小部件将其发送给提供者。但问题来了,我该在哪里做?显然,我不应该在build((上更新提供程序,但如果我在initState((上这样做,只有当我更改为包含相同小部件树但不同路径的路由时,它才会出错,例如/categies/apples->类别/香蕉。

Ps。出于某种原因,我不记得刷新的问题是什么。(这与重置提供程序有关(。但我记得的时候会更新的。

go_router的状态为params

因此将state传递到页面


路由器

GoRoute(
name: "test",
path: "/test/:id",
builder: (context, state) {
return SampleWidget(
goRouterState: state,  👈 Pass state here
);
},
),

用法

context.goNamed("test", params: {"id": "123"}),

页面中的重音

class SampleWidget extends StatelessWidget {
GoRouterState? goRouterState;
SampleWidget({super.key, this.goRouterState});
@override
Widget build(BuildContext context) {
print(goRouterState?.params.toString()); 👈 access anywhere like so
return const Scaffold(
body: ...
);
}
}

最新更新