Dart/Flutter 如何读取assets目录下长txt文件的指定段落内容
Flutter 提取assets txt文件指定段落实现方案
rootBundle.loadString 本身是一次性加载整个文件内容,针对你当前结构化的歌曲文本,直接对加载完成的内容做行拆分和匹配截取即可,实现成本最低,也能满足绝大多数场景下的使用需求。
实现步骤
- 第一步:将加载到的完整文本按换行符拆分为行列表
- 第二步:定义目标段落的起止匹配规则(你当前的文本结构中,每首歌以
序号. 歌曲名为开头,下一首歌的开头即为当前段落的结束标志) - 第三步:遍历行列表,收集起止范围内的内容即可
完整代码示例
1. 提取指定歌曲段落的方法实现
// 传入要提取的歌曲序号,比如提取song2就传2 Future<void> readTargetSong(int songIndex) async { final String fullText = await rootBundle.loadString('assets/longtextfile.txt'); // 拆分所有行 List<String> allLines = fullText.split('\n'); List<String> targetLines = []; bool isInTargetSection = false; // 定义起止匹配字符串 String startMatch = '$songIndex. song $songIndex'; String endMatch = '${songIndex+1}. song ${songIndex+1}'; for (String line in allLines) { // 匹配到起始行,开始收集 if (line.trim() == startMatch) { isInTargetSection = true; } // 匹配到结束行,停止收集 if (line.trim() == endMatch) { break; } // 处于目标区间时收集行内容 if (isInTargetSection) { targetLines.add(line); } } // 把行列表拼接回字符串,保留原有换行和空行 setState(() { dataFromFile = targetLines.join('\n'); }); }
2. 展示代码无需修改,直接使用原有Text组件即可
child: Center( child: Text( dataFromFile, style: TextStyle(color: Colors.white, fontSize: 20.0), ), ),
特殊场景适配说明
如果你的txt文件体积超过10M,确实需要流式逐行读取降低内存占用,可以使用dart:io的File配合openRead方法实现,但针对assets文件需要先把文件拷贝到应用临时目录再操作,实现复杂度更高,普通场景下上述方案完全够用。
内容的提问来源于stack exchange,提问作者user9784676
相关产品推荐
相关产品推荐

