Flutter教程Stream实现数据流控制

在Flutter中如何使用Stream实现数据流控制?最近在开发一个需要实时更新数据的应用,想了解Stream的具体用法和最佳实践。比如:

  1. StreamController和StreamBuilder应该如何配合使用?
  2. 如何处理Stream的错误和异常?
  3. 如何在多个页面之间共享同一个Stream?
  4. 有没有性能优化建议,比如避免内存泄漏或频繁重建?

希望有经验的开发者能分享一些代码示例和常见坑点,谢谢!

3 回复

在Flutter中,Stream 是处理异步事件流的重要工具。以下是一个简单的例子来说明如何使用 Stream 实现数据流控制。

  1. 创建 Stream:使用 StreamController 来创建和管理 Stream
  2. 发送数据:通过 add() 方法向 Stream 发送数据。
  3. 监听数据:使用 listen() 方法监听 Stream 中的数据。

代码示例:

import 'dart:async';

void main() {
  // 创建一个 StreamController
  final controller = StreamController<int>();

  // 监听 Stream
  controller.stream.listen(
    (data) => print('收到数据: $data'),
    onError: (error) => print('发生错误: $error'),
    onDone: () => print('完成'),
  );

  // 向 Stream 发送数据
  controller.add(1);
  controller.add(2);

  // 关闭 Stream
  controller.close();
}

这段代码会依次输出:

收到数据: 1
收到数据: 2
完成

这种方式非常适合用于实时数据流的控制,比如聊天消息、传感器数据等。

更多关于Flutter教程Stream实现数据流控制的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


Flutter中的Stream是处理异步事件流的强大工具。以下是一个简单的示例来展示如何使用Stream

  1. 创建Stream:可以使用StreamController来创建和管理Stream
import 'dart:async';

void main() {
  final controller = StreamController<int>();
  
  // 监听数据
  controller.stream.listen(
    (data) => print('收到数据: $data'),
    onError: (error) => print('错误: $error'),
    onDone: () => print('完成'),
  );

  // 发送数据
  controller.sink.add(1);
  controller.sink.add(2);
  controller.sink.close();
}
  1. 广播Stream:如果多个监听器需要接收相同的数据流,使用BroadcastStream
final broadcastController = StreamController<int>.broadcast();

broadcastController.stream.listen((data) => print('监听器1: $data'));
broadcastController.stream.listen((data) => print('监听器2: $data'));

broadcastController.sink.add(1);
  1. 处理Stream事件:使用StreamBuilder在Widget中动态更新UI。
Stream<int> countStream() async* {
  for (int i = 1; i <= 5; i++) {
    await Future.delayed(Duration(seconds: 1));
    yield i;
  }
}

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder<int>(
      stream: countStream(),
      initialData: 0,
      builder: (context, snapshot) {
        if (snapshot.hasError)
          return Text('Error: ${snapshot.error}');
        else
          return Text('当前计数: ${snapshot.data}');
      },
    );
  }
}

通过这些方法,你可以灵活地控制和处理数据流。记得在不再需要时关闭StreamController以释放资源。

Flutter Stream 数据流控制教程

Stream 是 Flutter 中处理异步数据流的核心机制,可用于事件处理、实时数据更新等场景。

基本概念

Stream 代表一个异步数据序列,可以监听其中的数据变化。Dart 提供了两种 Stream:

  • 单订阅 Stream (Single Subscription)
  • 广播 Stream (Broadcast)

基础使用

创建 Stream

// 1. 使用 StreamController
final controller = StreamController<int>();
Stream<int> numberStream = controller.stream;

// 2. 使用 async* 生成器
Stream<int> countStream(int max) async* {
  for (int i = 1; i <= max; i++) {
    await Future.delayed(Duration(seconds: 1));
    yield i;
  }
}

监听 Stream

// 基本监听
final subscription = numberStream.listen(
  (data) => print('Data: $data'),
  onError: (error) => print('Error: $error'),
  onDone: () => print('Stream closed'),
);

// 取消监听
subscription.cancel();

常用操作符

// 过滤
stream.where((data) => data > 5);

// 映射
stream.map((data) => data * 2);

// 合并多个流
StreamZip([stream1, stream2]);

// 缓冲
stream.bufferCount(3); // 每3个数据合并为列表

// 防抖
stream.debounce(Duration(seconds: 1));

广播 Stream

final broadcastController = StreamController<int>.broadcast();
Stream<int> broadcastStream = broadcastController.stream;

// 可以添加多个监听器
broadcastStream.listen((data) => print('Listener 1: $data'));
broadcastStream.listen((data) => print('Listener 2: $data'));

实际应用示例

// 搜索建议实现
final searchController = StreamController<String>();
final searchStream = searchController.stream
    .debounce(Duration(milliseconds: 300))
    .where((query) => query.length > 2)
    .asyncMap((query) => _fetchSuggestions(query));

// 在UI中使用
StreamBuilder(
  stream: searchStream,
  builder: (context, snapshot) {
    if (snapshot.hasError) return ErrorWidget(snapshot.error);
    if (!snapshot.hasData) return CircularProgressIndicator();
    return ListView.builder(
      itemCount: snapshot.data.length,
      itemBuilder: (context, i) => ListTile(title: Text(snapshot.data[i])),
    );
  },
)

Stream 是 Flutter 响应式编程的重要组成部分,合理使用可以简化异步数据管理。

回到顶部