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*: 适合简单的数据生成场景
回到顶部