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
相关产品推荐
相关产品推荐

