使用 Navigator.pushNamed 导航时如何发送参数

Posted

技术标签:

【中文标题】使用 Navigator.pushNamed 导航时如何发送参数【英文标题】:How to send parameters when navigating with Navigator.pushNamed 【发布时间】:2019-06-08 22:53:27 【问题描述】:

我需要将一些参数发送到命名路由。我想做类似的事情:

Navigator.pushNamed('/route/1');

或者

Navigator.pushNamed('/route?param1=1');

我不知道有没有办法做到这一点,我正在使用带有路由器的 MaterialApp。

【问题讨论】:

How do I pass non-string data to a named route in Flutter?的可能重复 【参考方案1】:

第一种方式是我在应用中使用的方式。

Navigator.pushNamed('/route/1');

不要忘记使用 onGenerateRoute 并传递值。 我的应用程序示例:

routes: 
        '/': (BuildContext context) => AuthPage(),
        '/products': (BuildContext context) => ProductsPage(''),
        '/admin': (BuildContext context) =>
            ProductsAdminPage(_addProduct, _deleteProduct),
      ,
      onGenerateRoute: (RouteSettings settings) 
        final List<String> pathElements = settings.name.split('/');
        if (pathElements[0] != '') 
          return null;
        
        if (pathElements[1] == 'product') 
          return MaterialPageRoute<bool>(
            builder: (BuildContext context) => ProductPage(pathElements[2]),
          );
        
        return null;
      ,
      onUnknownRoute: (RouteSettings settings) 
        return MaterialPageRoute(
            builder: (BuildContext context) => ProductsPage('Error'));
      ,

【讨论】:

【参考方案2】:

要直接回答您的问题,请参阅此重复问题:How do I pass non-string data to a named route in Flutter?

但是,大多数情况下,最好的方法是在路由之间传递参数,而是使用 app-state-management。例如 Redux 或 Bloc。您通常在第一个屏幕中修改状态,然后导航到第二个屏幕并阅读状态。这样做的好处是能够保持状态并以关闭时的相同状态重新打开您的应用程序。有关状态管理的更多信息,请参阅official docs。

【讨论】:

以上是关于使用 Navigator.pushNamed 导航时如何发送参数的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Navigator.pushNamed(context, "route");在我的 flutter-cupertino-app 代码示例中工作?

使用命名路由导航时找不到流提供程序

Flutter 中的命名路由如何消除重复?

Flutter appBar后退按钮不出现

在 webview 中颤动水平滑动手势

showBottomSheet 抛出错误,抱怨没有脚手架