Flutter字符串插值生成文件路径失效问题求助
Flutter动态生成Asset路径丢失.json后缀问题解决
我尝试通过变量动态加载assets中的JSON资源,将书籍名称传入后拼接路径,但运行时出现路径丢失.json后缀的错误,静态写死路径则正常工作。
初始实现代码
late final String selectedBook; @override void initState() { super.initState(); selectedBook = widget.bookName; print(selectedBook); final String book = selectedBook.toLowerCase().replaceAll(' ', ''); loadAsset(book); } Future<void> loadAsset(String book) async { final String response = await rootBundle.loadString('assets/json/$book.json'); final data = await json.decode(response); final secondLastIndex = data.length - 2; final chapterNumbers = data[secondLastIndex]['chapterNumber']; print(chapterNumbers); return chapterNumbers; }
错误现象
运行时抛出异常:
Unhandled Exception: Unable to load asset: "assets/json/peter
路径仅解析到变量部分,丢失了.json后缀。我尝试在initState中生成完整路径并打印:
void initState() { super.initState(); selectedBook = widget.bookName; print(selectedBook); final String book = selectedBook.toLowerCase().replaceAll(' ', ''); final filepath = "assets/json/$book.json"; print(filepath); loadAsset(book); }
打印结果显示为assets/json/exodus而非预期的assets/json/exodus.json,使用字符串拼接final filepath = 'assets/json/' + book + '.json';结果依然相同。完整日志如下:
I/flutter (29955): exodus I/flutter (29955): assets/json/exodus E/flutter (29955): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: Unable to load asset: "assets/json/exodus E/flutter (29955): The asset does not exist or has empty data. E/flutter (29955): #0 PlatformAssetBundle.load.<anonymous closure> (package:flutter/src/services/asset_bundle.dart:331:9) E/flutter (29955): <asynchronous suspension> E/flutter (29955): #1 AssetBundle.loadString (package:flutter/src/services/asset_bundle.dart:90:27) E/flutter (29955): <asynchronous suspension> E/flutter (29955): #2 _ChaptersState.loadAsset (package:bible/screens/chapters.dart:35:29) E/flutter (29955): <asynchronous suspension>
问题根源与解决方法
问题核心
传入的书籍名称字符串末尾包含隐藏的换行符、制表符等空白字符,导致拼接后的路径中.json被隐藏字符截断,打印时这些不可见字符会让.json被换到下一行,看起来像是后缀丢失。
解决步骤
彻底清理所有空白字符
替换原有的仅替换空格的逻辑,使用正则表达式匹配所有空白字符并移除:final String book = selectedBook.toLowerCase().replaceAll(RegExp(r'\s+'), '');正则
\s+会匹配空格、换行、制表符等所有空白类型,确保字符串完全干净。验证字符串处理结果
可以添加长度打印,确认隐藏字符已被移除:print('原始字符串长度:${selectedBook.length}'); print('处理后字符串长度:${book.length}');可选:直接传入完整路径
减少拼接环节,在initState中生成完整路径后传入方法:// initState中 final String book = selectedBook.toLowerCase().replaceAll(RegExp(r'\s+'), ''); final fullPath = "assets/json/$book.json"; loadAsset(fullPath); // 修改loadAsset方法 Future<void> loadAsset(String fullPath) async { final String response = await rootBundle.loadString(fullPath); // 后续逻辑不变 }
内容的提问来源于stack exchange,提问作者Clinton Njiru
相关产品推荐
相关产品推荐

