目录

前言

1. 什么是Stream?

2. Stream的分类

1.单订阅Stream

2.广播Stream (Broadcast Stream):

3. Stream的基础用法

1.创建

1.使用Stream.periodic

2.使用StreamController

2.监听

3.关闭Stream

4.Stream 转换与处理

1.map

2.asyncMap

5.实际应用场景

6.完整示例:计数器应用


前言

1. 什么是Stream?

        在 Flutter 中,Stream 是一种用于处理异步数据流的工具。它的作用类似广播频道,允许连续推送数据流,并让其他部分实时监听这些数据。Stream 广泛应用于需要异步处理的场景,比如网络请求、用户输入、数据流实时更新等。

2. Stream的分类

        在 Flutter 中,Stream 分为两类:

1.单订阅Stream

        单订阅Stream(Single-Subscription Stream)一次只能有一个监听器(listener)。

        通常用于一次性的事件,比如从 API 获取数据。

2.广播Stream (Broadcast Stream):

        广播(Broadcast Stream)允许多个监听器,可以同时向多个订阅者推送数据。

        这种类型适合用于事件广播,比如用户操作、全局数据推送等。

3. Stream的基础用法

1.创建

        可以使用 Stream 的构造方法,也可以通过 StreamController 自定义数据流。

1.使用Stream.periodic

        我们可以使用Stream.periodic定时生成数据流:

Stream<int> numberStream = Stream.periodic(Duration(seconds: 1), (count) => count);

2.使用StreamController

        Flutter还可以使用StreamController手动推送数据。

final StreamController<int> controller = StreamController<int>();

Stream<int> myStream = controller.stream;

controller.sink.add(1); // 推送数据

2.监听

        使用 listen 方法可以轻松监听 Stream 的数据变化。

myStream.listen((data) {

  print('Received: $data');

});

3.关闭Stream

        使用 StreamController 时,在不再需要时调用 close 方法来释放资源,防止内存泄漏。

controller.close();

4.Stream 转换与处理

        Stream 提供了许多用于数据流转换和处理的方法,比如 map、where、asyncMap 等。可以使用这些方法高效地处理流数据。

1.map

        用于将数据流的每个元素映射成不同的值。

myStream.map((value) => value * 2).listen((data) {

  print('Mapped Value: $data');

});

2.asyncMap

        用于异步处理每个数据元素。

myStream.asyncMap((value) async {

  return await Future.delayed(Duration(seconds: 1), () => value * 2);

}).listen((data) {

  print('Async Mapped Value: $data');

});

5.实际应用场景

        Flutter中Stream的应用场景如下:

  1. 网络请求:使用 Stream 可以轻松处理 HTTP 请求响应,尤其适合需要连续多次请求的场景。
  2. 用户输入监听:监听用户输入变化,比如搜索框的输入变化。
  3. 实时数据更新:比如股票、天气、聊天应用等需要实时数据推送的场景。
  4. 多事件处理:多个监听器同时监听并响应同一个事件源,比如按钮点击。

6.完整示例:计数器应用

        下面是一个简单的计数器应用示例,展示了 Stream 在应用中如何工作:

import 'dart:async';

import 'package:flutter/material.dart';

class StreamMainPage extends StatefulWidget {
  const StreamMainPage({
    super.key,
  });
  @override
  State<StreamMainPage> createState() => _StreamMainPageState();
}

class _StreamMainPageState extends State<StreamMainPage> {
  final StreamController<int> _controller = StreamController<int>();

  int _counter = 0;
  @override
  void initState() {
    super.initState();
    // 使用 Timer.periodic 定时自增计数器
    Timer.periodic(const Duration(seconds: 1), (timer) {
      _counter++;
      _controller.sink.add(_counter);
    });
  }

  @override
  void dispose() {
    _controller.close(); // 关闭 Stream 防止内存泄漏
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.purple,
        title: const Text('Stream用法',style: TextStyle(color: Colors.white,fontWeight: FontWeight.bold,fontSize: 16),),
      ),
      body: Center(
        child: StreamBuilder<int>(
          stream: _controller.stream,
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              return Text('Counter: ${snapshot.data}',
                  style: const TextStyle(fontSize: 24));
            } else {
              return const CircularProgressIndicator();
            }
          },
        ),
      ),
    );
  }
}

7.总结

        在 Flutter 中,Stream 是一种处理异步事件流的利器,适用于需要实时推送和监听数据的场景。通过 Stream 可以实现高效的数据流处理和转换,尤其适合需要异步响应的 UI 场景。在实际应用中,合理使用 Stream 可以使代码更加简洁和高效,也能够极大地改善用户体验。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部