flutter 如何在go_router中重写url?

gdrx4gfi  于 2023-01-06  发布在  Flutter
关注(0)|答案(1)|浏览(179)

我希望处理类似/?query=xxx的url,并重定向到url /query/,查询内容以extra的形式传递

// Where should this code go ?
if (state.queryParams["code"] != null) {
  context.goNamed('query', extra: state.queryParams["query"]);
}
...

GoRoute(
  name: 'query',
  path: '/query',
  builder: (context, state) => QueryScreen(query: state.extra.toString()),
),

尝试在另一个GoRoute构建器中添加此条件逻辑时,应用程序在运行时中断,并显示错误No GoRouter found in context
GoRouter中的redirect键预期返回一个字符串,因此似乎无法指定传递给屏幕小部件的额外变量。
有没有比 Package 我的StatelessWidget in a StatefulWidget wrapper更简单/更好的解决方案,它将在context.go的initState方法中执行context.go
编辑:实际上,initState不能访问其上下文中的GoRouter和Navigator,尝试使用Timer或SchedulerBinding延迟重定向的执行不会改变任何东西。

tv6aics1

tv6aics11#

总结:

有两种方式paramsqueryParams

  • 使用params
  • 如果事先知道参数的数量
  • 用法:path = '/routeName/:id1/:id2'
  • 使用queryParams
  • 当您不确定参数的数量时
  • 用法:path = '/routeName'

解释:

1.使用Params
如果要在settings路由中添加name参数,路径参数应为/settings:name。可以使用state.params["name"] variable访问路由参数。

将其定义为:
GoRoute(
    path: "/settings/:name",
    builder: (context, state) => SettingsPage(
      name: state.params["name"]!,
    ),
 );
接收为:
class SettingsPage extends StatelessWidget {
  final String name;

  const SettingsPage({super.key, required this.name});

  @override
  Widget build(BuildContext context) {
    return Scaffold();
  }
}

2.使用queryParams

您可以在context.goNamed()函数中访问queryParamsqueryParams的最大优点是,您不必在路由路径中显式定义它们,可以使用state.queryParams方法轻松访问它们。您可以添加各种用户相关数据作为查询参数。

添加参数,如下所示
child: ElevatedButton(
  onPressed: () => context.goNamed("settings", 
  queryParams: {
    "email": "example@gmail.com",
    "age": "25",
    "place": "India"
    }),
    child: const Text("Go to Settings page"),
),
接收为:
GoRoute(
  name: "settings",
  path: "settings",
  builder: (context, state) {
    state.queryParams.forEach(
      (key, value) {
        print("$key:$value");
       },
     );
   return SettingsPage();
 },
)

有关在路由之间传递object的信息,请参阅https://stackoverflow.com/a/74813017/13431819

相关问题