Flutter中HandbookOptions传link到PDFViewer时assetName.isNotEmpty断言失败
解决PDFViewer参数传递失败的断言错误
问题根源
你遇到的'assetName.isNotEmpty': is not true错误,本质是PDFViewer接收的link参数为空字符串:
- HandbookOptions里的InkWell跳转时,传给路由的arguments是固定文本
'Text from homepage',而非实际的widget.link; - 路由配置未正确将arguments传递给PDFViewer构造函数,导致PDFViewer的link参数为空,触发SfPdfViewer.asset的非空断言。
修复方案
方案1:直接跳转传参(最直观)
修改HandbookOptions中的InkWell点击事件,跳过路由命名跳转,直接用MaterialPageRoute传递参数:
// HandbookOptions内的InkWell代码替换为: InkWell( onTap: () => Navigator.of(context).push( MaterialPageRoute( builder: (context) => PDFViewer(link: widget.link), ), ), ),
这种方式直接将link传给PDFViewer,彻底避免参数丢失。
方案2:修复路由传参逻辑
若坚持使用命名路由跳转,需同步修改两处代码:
- 修正HandbookOptions的跳转参数:
// HandbookOptions内的onTap代码替换为: onTap: () => Navigator.of(context).pushNamed( widget.source, arguments: widget.link, // 替换原固定文本 ),
- 在MaterialApp的
onGenerateRoute中处理参数传递:
MaterialApp( onGenerateRoute: (settings) { if (settings.name == '/pdf') { final String link = settings.arguments as String; return MaterialPageRoute( builder: (context) => PDFViewer(link: link), ); } // 其他路由逻辑 return null; }, );
可选:添加空值防御
为避免后续类似问题,可在PDFViewer的build方法中增加空值校验:
@override Widget build(BuildContext context) { if (widget.link.isEmpty) { return SafeArea( child: Scaffold( appBar: AppBar( backgroundColor: Colors.black, title: const Text('PDF Viewer'), ), body: const Center(child: Text('无效的PDF资源路径')), ), ); } // 原Scaffold代码 return SafeArea(...); }
验证修改
完成修改后,点击HandbookOptions卡片时,PDFViewer会收到正确的'assets/pdf/Regnum_Dei.pdf'路径,SfPdfViewer.asset可正常加载资源,断言错误将消失。
内容的提问来源于stack exchange,提问作者Polly
相关产品推荐
相关产品推荐

