Flutter如何解决GoRouter.routeInformationProvider缺失报错
问题根因
这个报错不是项目本身的业务逻辑问题,是依赖版本不匹配导致的:
- 示例项目的
pubspec.yaml没有锁定go_router的依赖版本范围,你本地拉取依赖时会自动安装符合版本约束的最新版go_router,而示例代码是基于旧版go_router的API写的。 - go_router从5.0版本开始调整了路由初始化的校验规则,旧写法只传
routeInformationParser和routerDelegate两个参数,缺少强制要求的routeInformationProvider,就会触发你看到的断言报错。
修复方案
二选一即可:
- 适配新版go_router(推荐)
打开项目中配置MaterialApp.router的文件(通常是main.dart或入口的app组件文件),补全路由相关的三个配置参数,全部直接使用你创建的GoRouter实例自带的属性即可,不需要自定义实现:
改完完全重启应用(不要用热重载)即可正常运行。// 假设你已经提前创建了GoRouter实例命名为router final GoRouter router = GoRouter( // 原有路由配置完全不用改 routes: [], ); class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp.router( title: 'Boring to Beautiful', theme: ThemeData(/* 原有主题配置保持不变 */), // 补全下面三个参数 routeInformationProvider: router.routeInformationProvider, routeInformationParser: router.routeInformationParser, routerDelegate: router.routerDelegate, ); } } - 锁死旧版兼容依赖
如果你不想改初始化代码,可以直接把go_router版本锁定到示例编写时兼容的4.5.1版本。打开pubspec.yaml修改go_router依赖:
修改后执行dependencies: flutter: sdk: flutter go_router: 4.5.1 # 不要加^前缀,强制锁死版本flutter pub get拉取对应版本依赖,再启动应用就不会报错。
补充说明:go_router 5.0版本的更新日志中明确标注了这个API breaking change,要求所有升级到该版本及以上的应用必须传入三个路由参数,旧的两参数写法已经被废弃。官方示例后续会同步更新适配新版依赖,目前用上述两种方案都可以正常跑通全部教程流程。
内容的提问来源于stack exchange,提问作者Mg Bhadurudeen
相关产品推荐
相关产品推荐

