Flutter:go_router如何将多个参数传递到其他屏幕?

2024-05-01

在普通颤动中,我用来将多个参数传递到其他屏幕,如下所示:

    Navigator.of(context).push(MaterialPageRoute(
                                    builder: (_) => CatalogFilterPage(
                                          list: list,
                                          bloc: bloc,
                                        )))

非常简单和容易。我可以传递 2 个所需的参数,列表和块。在 CatalogFilterPage 中使用它之后。

现在切换到 go_router 并查看之后文档 https://gorouter.dev/我似乎找不到如何传递多个数据。即使传递单个对象似乎也不是那么好:

    onTap: () =>
              context.pushNamed('SelectedCatalogItem', extra: list[index]),

在路由器中,我必须使用强制转换来设置正确的类型:

    builder: (context, state) => SelectedCatalogItem(
                    item: state.extra as ListItemsModel,
                  ),

对于单个参数来说很好。但现在我不知道如何传递多个参数。我该怎么做?甚至传递参数(例如模型)作为额外的方法是正确的方法吗?

附:我知道你可以将参数传递为context.pushNamed('CatalogFilterPage', params: ___), but params具有 Map 类型,不允许我传递模型的


编辑:重大变化Go_路由器7.0.0 https://docs.google.com/document/d/10Xbpifbs4E-zh6YE5akIO8raJq_m3FIXs6nUGdOspOg/edit

简而言之

Below Go Router 7 i.e < 7.0.0 use `params`, `queryParams`
Above Go Router 7 i.e >=7.0.0 use `pathParameters`, `queryParameters`

Summary:

有以下三种方式:pathParameters, queryParameters, extra

  1. Using pathParameters
    • 当你事先知道参数的数量时
    • Usage : path = '/routeName/:id1/:id2'
  2. Using queryParameters
    • 当你不确定参数的数量时
    • Usage : path = '/routeName'
  3. Using extra
    • 当你想通过的时候object

解释:

1. 使用pathParameters

当您事先知道参数数量时使用pathParameters支撑context.goNamed()

将其定义为:
GoRoute(
  path: '/sample/:id1/:id2',  // ???? Defination of params in the path is important
  name: 'sample',
  builder: (context, state) => SampleWidget(
    id1: state.pathParameters['id1'],
    id2: state.pathParameters['id2'],
  ),
),
称其为:
ElevatedButton(
  onPressed: () {
    var param1 = "param1";
    var param2 = "param2";
    context.goNamed("sample", pathParameters: {'id1': param1, 'id2': param2});
  },
  child: const Text("Hello"),
),
接收它为:
class SampleWidget extends StatelessWidget {
  String? id1;
  String? id2;
  SampleWidget({super.key, this.id1, this.id2});

  @override
  Widget build(BuildContext context) {
     ...
  }
}

2. 使用queryParameters

您可以访问queryParameters in the context.goNamed()功能。最好的事情是queryParameters是您不必在路线路径中显式定义它们,并且可以使用state.queryParameters方法。您可以添加各种与用户相关的数据作为查询参数。

将其定义为:
GoRoute(
  name: "sample",
  path: "/sample",          
  builder: (context, state) => SampleWidget(
      id1: state.queryParameters['id1'],
      id2: state.queryParameters['id2'],
  ),
)
称其为:
ElevatedButton(
  onPressed: () {
    var param1 = "param1";
    var param2 = "param2";
    context.goNamed("sample", queryParameters: {'id1': param1, 'id2': param2});
  },
  child: const Text("Hello"),
),
接收它为:
class SampleWidget extends StatelessWidget {
  String? id1;
  String? id2;
  SampleWidget({super.key, this.id1, this.id2});

  @override
  Widget build(BuildContext context) {
     ...
  }
}

3. 使用extra

当你想通过一个model/object路线之间

GoRoute(
  path: '/sample',
  builder: (context, state) {
    Sample sample = state.extra as Sample; // ???? casting is important
    return GoToScreen(object: sample);
  },
),

Refer https://stackoverflow.com/a/74813017/13431819 https://stackoverflow.com/a/74813017/13431819为了通过object路线之间

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter:go_router如何将多个参数传递到其他屏幕? 的相关文章

随机推荐