Flutter中Navigator 2.0如何实现Navigator.pushNamed的等效功能?
在使用 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
相关产品推荐
相关产品推荐

