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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 15:39:02