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

GridView.builder仅返回最后一个PDF文件,点击其他文件加载失败

Flutter Asset PDF阅读器仅能打开最后一个文件的问题修复

问题根源

  • 路径末尾含多余空格:files.txt中每条路径末尾都带空格,导致资源加载时路径不匹配,抛出Unable to load asset异常。
  • 列表处理不规范:split('\n')分割后可能产生空字符串,导致列表长度异常,只有最后一个有效路径能被正确识别。
  • 空状态判断失效:assetFilePaths == null判断逻辑错误,初始化时列表已为空数组,永远不会触发进度指示器。
  • 变量命名冲突:onPressed中使用path作为变量名,覆盖了导入的path库,可能导致路径解析异常。

修复方案

1. 清理files.txt路径

删除每条路径末尾的空格,确保内容如下:

assets/books/Masud Rana - Durgom Durgo.pdf
assets/books/advs.pdf
assets/books/Flutter Roadmap.pdf
assets/books/Mein Kampf Adolf Hitler.pdf
assets/books/The Da Vinci Code.pdf

2. 优化路径解析逻辑

修改_getAssetFilePaths方法,过滤空字符串并去除路径首尾空格:

void _getAssetFilePaths() async {
  String fileString = await rootBundle.loadString('assets/files.txt');
  List filePaths = fileString.split('\n')
      .where((item) => item.trim().isNotEmpty)
      .map((item) => item.trim())
      .toList();
  setState(() {
    assetFilePaths = filePaths;
  });
  print(assetFilePaths);
}

3. 修正空状态判断

将assetFilePaths == null改为assetFilePaths.isEmpty,确保加载过程显示进度指示器:

return assetFilePaths.isEmpty
    ? Center(child: CircularProgressIndicator())
    : Container(
        decoration: BoxDecoration(
            borderRadius: BorderRadius.circular(10),
            color: Colors.green
        ),
        // ... 其余原有代码
      );

4. 解决变量命名冲突

修改onPressed中的变量名,避免覆盖导入的path库:

onPressed: () async {
  print(assetFilePaths);
  final assetPath = assetFilePaths[index];
  final file = await PDFApi.loadAsset(assetPath);
  openPDF(context, file);
},
child: Text(path.basenameWithoutExtension(assetFilePaths[index]))

内容的提问来源于stack exchange,提问作者Syed Mishkatul Haque

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 02:35:49