Flutter如何创建Stream<Uint8List>
在Flutter中需要处理二进制数据流,但不太清楚如何正确创建Stream<Uint8List>。具体场景是从网络接口或本地文件读取字节数据时,希望能以流式方式逐步处理。请问应该如何实现这样的字节流?是否需要结合dart:io或dart:typed_data?能否提供一个简单的代码示例说明创建和消费这个Stream的过程?
2 回复
使用StreamController<Uint8List>创建:
final controller = StreamController<Uint8List>();
Stream<Uint8List> stream = controller.stream;
// 添加数据
controller.add(Uint8List.fromList([1,2,3]));
// 完成后关闭
controller.close();
可通过Stream.fromIterable()或自定义async函数创建流。
更多关于Flutter如何创建Stream<Uint8List>的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中创建Stream<Uint8List>有多种方式,以下是几种常见方法:
1. 使用StreamController创建
import 'dart:async';
import 'dart:typed_data';
Stream<Uint8List> createByteStream() {
final controller = StreamController<Uint8List>();
// 模拟数据生成
Timer.periodic(Duration(seconds: 1), (timer) {
final data = Uint8List.fromList(List.generate(10, (i) => i));
controller.add(data);
// 5秒后停止
if (timer.tick >= 5) {
controller.close();
timer.cancel();
}
});
return controller.stream;
}
2. 从文件创建Stream
import 'dart:io';
Stream<Uint8List> createStreamFromFile(String filePath) async* {
final file = File(filePath);
final stream = file.openRead();
await for (final chunk in stream) {
yield Uint8List.fromList(chunk);
}
}
3. 使用async*生成器
Stream<Uint8List> generateByteData() async* {
for (int i = 0; i < 5; i++) {
await Future.delayed(Duration(seconds: 1));
yield Uint8List.fromList([i, i+1, i+2]);
}
}
4. 使用示例
// 在Widget中使用
StreamBuilder<Uint8List>(
stream: createByteStream(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return Text('收到数据: ${snapshot.data}');
}
return CircularProgressIndicator();
},
)
选择哪种方法取决于你的具体需求:
- StreamController: 适用于需要手动控制数据发射的场景
- 文件流: 适合处理文件数据
- async*: 适合简单的数据生成场景

