Flutter模拟器报GoException路由错误,为何未显示Jobs页面?
GoRouter抛出GoException:无匹配路由,无法显示Jobs页面
问题描述
运行Flutter模拟器时出现错误提示:
GoException: no routes for location: https://www.[testurl].com/jobs/testjobtitle
为何没有按照代码中appBar: AppBar(title: const Text('Jobs'))的定义,显示带有“Jobs”标题的空白页面?测试代码如下:
void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); runApp(MaterialApp.router(routerConfig: router)); } final router = GoRouter( routes: [ GoRoute( path: '/', builder: (_, __) => Scaffold( appBar: AppBar(title: const Text('Home Screen')), ), routes: [ GoRoute( path: 'jobs/*', // builder: (_, state) => ItemDetails(path: state.path), builder: (_, __) => Scaffold( appBar: AppBar(title: const Text('Jobs')), ), ), ], ), ], );
原因分析
你的GoRouter配置的是相对路由规则,但访问的是包含完整域名的绝对URL,GoRouter无法自动匹配这类外部URL到内部路由。
子路由path: 'jobs/*'是基于父路由/的相对路径,它能匹配的是/jobs/testjobtitle这类内部路径;而当前跳转的https://www.[testurl].com/jobs/testjobtitle是带域名的外部链接,GoRouter不会自动剥离域名部分去匹配内部路由规则,因此抛出无匹配路由的异常。
解决方案
- 内部跳转用相对路径:如果是通过GoRouter的
context.go()或context.push()方法跳转,直接传入内部相对路径即可,示例:context.go('/jobs/testjobtitle'); - 处理外部深度链接:如果是从外部浏览器或其他App跳转的深度链接,可通过
redirect回调转换路径:final router = GoRouter( redirect: (context, state) { final uri = state.uri; if (uri.host == 'www.[testurl].com') { return uri.path; } return null; }, routes: [/* 现有路由配置 */], ); - 检查跳转逻辑:确认触发路由的代码中,传入的是内部路由路径而非完整外部URL。
内容的提问来源于stack exchange,提问作者Nibbles
相关产品推荐
相关产品推荐

