You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中Navigator 2.0如何实现Navigator.pushNamed的等效功能?

Flutter Navigator 2.0 路由切换实现方法

在使用 MaterialApp.router 搭配自定义 RouterDelegate 和 RouteInformationParser 的 Navigator 2.0 模式下,旧版的 Navigator.of(context).pushNamed('/profile') 不再生效,因为导航控制权已完全交由你自定义的路由管理类,需要通过更新路由状态来触发页面切换,具体实现方式如下:

  • 第一步:在自定义 RouterDelegate 中维护路由状态
    通常会用一个列表管理路由栈,同时提供更新栈的方法,并通过状态通知触发页面重建:

    class YourCustomRouterDelegate extends RouterDelegate<RouteConfiguration>
        with ChangeNotifier {
      // 维护当前路由栈
      final List<RouteSettings> _routeStack = [RouteSettings(name: '/home')];
    
      // 新增路由的方法
      void pushRoute(String routeName) {
        _routeStack.add(RouteSettings(name: routeName));
        notifyListeners(); // 通知框架路由状态更新,触发页面重建
      }
    
      // ... 其他 RouterDelegate 必须实现的方法
    }
    

    注意:RouterDelegate 需要混入 ChangeNotifier 或使用其他状态管理方案,确保状态变化能被框架感知。

  • 第二步:在页面中调用路由切换方法
    在按钮的 onPressed 回调中,获取自定义 RouterDelegate 实例并调用切换方法:

    onPressed: () {
      final delegate = Router.of(context).routerDelegate as YourCustomRouterDelegate;
      delegate.pushRoute('/profile');
    }
    
  • 可选:同步更新地址栏(适配 Web 场景)
    如果需要让路由变化同步到浏览器地址栏,可以通过 SystemNavigator 更新路由信息,这种方式会先触发 RouteInformationParser 解析新路由,再由 RouterDelegate 更新页面:

    onPressed: () {
      SystemNavigator.routeInformationUpdated(
        location: '/profile',
      );
    }
    

此外,需确保你的 RouteInformationParser 能正确将 /profile 解析为对应的路由配置,这样 RouterDelegate 才能根据解析结果构建出正确的页面。

内容的提问来源于stack exchange,提问作者Leonardo Mantovani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 10:48:19