Flutter中.take()方法未按指定数量取值问题求助
问题:列表取前200元素再拆分每组20项,
.take()方法不生效 我需要处理一个列表:先提取前200个元素,再拆分成每组20项的子列表,但.take()方法没达到预期效果。
我的代码:
static Future<List> localPath() async { File textAsset = File('/storage/emulated/0/RPSApp/assets/bluetooth.txt'); final text = await textAsset.readAsString(); final bytes = text .split(',') .map((s) => s.trim()) .map((s) => int.parse(s)) .toList(); int chunkSize = 20; final dd = bytes.take(200); print("BYTES : $dd"); List<int> padTo(List<int> input, int count) { return [...input, ...List.filled(count - input.length, 255)]; } List<int> padToChunksize(List<int> input) => padTo(input.toList(), chunkSize); final items = bytes.slices(chunkSize).map(padToChunksize).take(200).toList(); return items; }
尝试过的无效写法:
return items.take(200).toList();
函数调用方式:
final chunks = await Utils.localPath(); await Future.forEach(chunks, (chunk) async { final d = chunk as List<int>; await c.write(d, withoutResponse: true); await c.read(); await Future.delayed(const Duration(seconds: 4)); });
解决方案
问题核心是你调用.take(200)的时机完全错误:你先把整个bytes列表按20项拆分,再取前200个子列表,这和“先取200个元素再拆分”的需求完全相悖。
正确的执行步骤:
- 先从原列表
bytes中提取前200个元素 - 再将这200个元素按每组20项拆分
- 最后对每个子列表做补全操作
修改后的代码:
static Future<List<List<int>>> localPath() async { File textAsset = File('/storage/emulated/0/RPSApp/assets/bluetooth.txt'); final text = await textAsset.readAsString(); final bytes = text .split(',') .map((s) => s.trim()) .map((s) => int.parse(s)) .toList(); const chunkSize = 20; // 第一步:取前200个元素,必须调用.toList(),因为take返回的是迭代器而非列表 final first200Bytes = bytes.take(200).toList(); print("BYTES : $first200Bytes"); List<int> padTo(List<int> input, int count) { return [...input, ...List.filled(count - input.length, 255)]; } List<int> padToChunksize(List<int> input) => padTo(input, chunkSize); // 第二步:对截取后的200个元素拆分、补全 final items = first200Bytes .slices(chunkSize) .map(padToChunksize) .toList(); return items; }
关键修正点:
- 必须对
bytes.take(200)调用.toList(),因为.take()返回的是惰性迭代器,不是实际列表,不转成列表后续操作会出错 - 拆分操作要基于截取后的
first200Bytes,这样得到的是200/20=10个子列表,完全符合需求 - 原代码直接对
bytes.slices(chunkSize)取前200组,实际是把整个大列表拆完后取前200个20项组,完全偏离初衷
另外,建议给函数返回值指定明确类型Future<List<List<int>>>,避免后续类型转换的额外操作。
内容的提问来源于stack exchange,提问作者rania
相关产品推荐
相关产品推荐

