You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:修复路由传参逻辑

若坚持使用命名路由跳转,需同步修改两处代码:

  1. 修正HandbookOptions的跳转参数:
// HandbookOptions内的onTap代码替换为:
onTap: () => Navigator.of(context).pushNamed(
  widget.source,
  arguments: widget.link, // 替换原固定文本
),
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 09:40:32