Flutter GoRouter路径参数异常:API数据传递后显示Null
问题排查与解决方案
核心问题分析
- 重定向逻辑错误:你的重定向代码中,手动拼接
/note/$title/$tags/$summary路径时,state.pathParameters在重定向触发时并未携带正确参数,导致新路径中的参数被替换为null。而硬编码时参数直接传入GoRouter,未经过重定向的错误拼接,因此功能正常。 - 路径参数未编码:API返回的数据可能包含空格、特殊字符等,直接作为路径参数传递会触发GoRouter解析异常,导致参数丢失。硬编码的字符串无特殊字符,所以不受影响。
解决方案
1. 修复重定向逻辑
删除手动拼接路径的代码,重定向只需处理权限校验,无需重新构造路径:
else if (isGoingToNote && auth) { // 已通过权限验证,直接允许访问目标路由 return null; } else if (isGoingToNote && !auth) { // 未登录则跳转到登录页 return '/login'; }
注:GoRouter的重定向返回
null表示允许当前路由跳转,无需修改路径。
2. 对路径参数进行URI编码/解码
传递参数前编码,接收时解码,避免特殊字符干扰:
在summarize_controller中传递参数时编码:
if (response.statusCode == 200) { print("Title of note: ${titleController.text}"); print("Tags of note: ${tagsController.text}"); print("Summary of note: ${summaryController.text}"); // 对参数进行URI编码 final encodedTitle = Uri.encodeComponent(titleController.text); final encodedTags = Uri.encodeComponent(tagsController.text); final encodedSummary = Uri.encodeComponent(summaryController.text); GoRouter.of(context).goNamed('note', pathParameters: { 'title': encodedTitle, 'tags': encodedTags, 'summary': encodedSummary, }); }
在note_screen的路由builder中解码:
GoRoute( path: '/note/:title/:tags/:summary', name: 'note', builder: (context, state) { var pathParams = state.pathParameters; print("After passing: $pathParams"); // 解码参数 var title = Uri.decodeComponent(pathParams['title']!); var tags = Uri.decodeComponent(pathParams['tags']!); var summary = Uri.decodeComponent(pathParams['summary']!); return SafeArea( child: NoteScreen( title: title, tagString: tags, summary: summary, ), ); }, ),
3. 额外验证:确认API返回值非空
虽然已确认API返回有效数据,仍需添加空值判断避免意外:
titleController.text = responseBody['title'] ?? '默认标题'; tagsController.text = (responseBody['tags'] as List<dynamic>?)?.join(', ') ?? '默认标签'; summaryController.text = responseBody['summary'] ?? '默认摘要';
内容的提问来源于stack exchange,提问作者Muzammil
相关产品推荐
相关产品推荐

