大型Flutter应用使用Navigator 2.0的最佳实践是什么?
你提到的手写RouterDelegate和路由配置类的方案,本质是原生Navigator 2.0的底层实现逻辑,页面量级上来后确实会出现属性泛滥、判断逻辑冗余的问题,有以下几种优化思路:
方案1:抽象统一路由栈状态,消除零散属性
不要为每个页面单独定义状态属性,直接将整个页面栈抽象为统一的路由配置列表,配合路由表实现无感知新增页面:
第一步:定义通用路由配置类
class RouteItem { final String path; final Map<String, dynamic>? args; const RouteItem(this.path, {this.args}); }
第二步:定义全局路由表
所有页面的映射关系统一维护在路由表中,新增页面仅需要新增一条映射记录:
final appRouteTable = <String, Page Function(RouteItem)>{ '/home': (item) => MaterialPage(child: const HomePage(), key: const ValueKey('/home')), '/color': (item) => MaterialPage(child: ColorPage(code: item.args?['code']), key: ValueKey('/color/${item.args?['code']}')), '/shape_border': (item) => MaterialPage(child: ShapeBorderPage(type: item.args?['type']), key: ValueKey('/shape_border/${item.args?['type']}')), '/404': (item) => MaterialPage(child: const UnknownPage(), key: const ValueKey('/404')), };
第三步:简化RouterDelegate实现
RouterDelegate中仅需要维护一个路由栈列表,无需额外定义页面相关的状态属性:
class AppRouterDelegate extends RouterDelegate<List<RouteItem>> { List<RouteItem> _routeStack = [const RouteItem('/home')]; @override Widget build(BuildContext context) { return Navigator( pages: _routeStack.map((item) { final pageBuilder = appRouteTable[item.path] ?? appRouteTable['/404']!; return pageBuilder(item); }).toList(), onPopPage: (route, result) { if (!route.didPop(result)) return false; if (_routeStack.length > 1) { _routeStack.removeLast(); notifyListeners(); } return true; }, ); } // 封装通用路由操作方法 void push(String path, {Map<String, dynamic>? args}) { _routeStack.add(RouteItem(path, args: args)); notifyListeners(); } void pop() { if (_routeStack.length > 1) { _routeStack.removeLast(); notifyListeners(); } } // 其他路由操作replace、popUntil等可以按同样逻辑封装 }
方案2:使用封装成熟的路由框架
如果不想手动封装底层逻辑,可以直接使用Flutter官方维护的go_router框架,其底层基于Navigator 2.0实现,已经封装了所有样板代码,仅需要定义路由匹配规则即可完成多页面路由配置,无需手写RouterDelegate和冗余的状态判断逻辑。
方案3:针对不需要URL映射的场景简化实现
如果你的应用是纯移动端应用,不需要支持浏览器地址栏URL同步、深链跳转等能力,可以直接使用Navigator 1.0的API或者基于Navigator 2.0封装的隐式路由实现,完全不需要维护路由配置类和状态属性,开发效率更高。
内容的提问来源于stack exchange,提问作者Zane Li
相关产品推荐
相关产品推荐

