Flutter订阅流管理插件subscribed_stream的使用

Flutter订阅流管理插件subscribed_stream的使用

特性

  • 从Stream创建一个StreamSubscription对象
  • 使用内置回调方法转换事件数据
  • 缓存最近接收到的事件数据

开始使用

建议在BLOC或Provider类中使用。

示例代码

初始化SubscribedStream

import 'package:flutter/material.dart';

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final stream = Stream.periodic(Duration(seconds: 1), (i) => "Data $i");

  // 创建一个SubscribedStream实例
  late final subscribedStream = SubscribedStream<String>(
    stream: stream,
    onStreamEvent: (data, previousData, subscribedStream) {
      // 如果当前数据与之前的数据不同,则通知UI更新
      if (data != previousData) {
        print("Data updated: $data");
      }
      // 返回处理后的数据
      return data;
    },
  );

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SubscribedStream 示例'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            // 显示最新的数据值
            Text('最新值: ${subscribedStream.latestValue}'),
          ],
        ),
      ),
    );
  }
}

SubscribedStream 类定义

以下是SubscribedStream类的实现:

class SubscribedStream<T> {
  /// 存储的最新值
  T? _latestValue;

  /// 存储的原始StreamSubscription
  StreamSubscription<T>? _subscription;

  /// 构造函数
  SubscribedStream({
    required Stream<T> stream,
    required Function(T data, T? previousData, SubscribedStream<T> stream) onStreamEvent,
  }) {
    // 订阅流
    _subscription = stream.listen((data) {
      // 调用回调函数处理数据
      final newData = onStreamEvent(data, _latestValue, this);
      // 更新最新值
      _latestValue = newData;
    });
  }

  /// 获取最新的值
  T? get latestValue => _latestValue;

  /// 关闭流订阅
  void dispose() {
    _subscription?.cancel();
  }
}

更多关于Flutter订阅流管理插件subscribed_stream的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter订阅流管理插件subscribed_stream的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,subscribed_stream 是一个用于管理订阅流的插件。它允许你订阅一个流,并在需要时取消订阅,以避免内存泄漏和其他潜在问题。以下是如何使用 subscribed_stream 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 subscribed_stream 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  subscribed_stream: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

2. 导入包

在你的 Dart 文件中导入 subscribed_stream 包:

import 'package:subscribed_stream/subscribed_stream.dart';

3. 创建 SubscribedStream 实例

你可以通过 SubscribedStream 类来管理你的订阅流。以下是一个简单的示例:

class MyWidget extends StatefulWidget {
  [@override](/user/override)
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  final SubscribedStream<int> _stream = SubscribedStream();

  [@override](/user/override)
  void initState() {
    super.initState();

    // 订阅一个流
    _stream.subscribe(Stream.periodic(Duration(seconds: 1), (count) => count), (data) {
      print("Received data: $data");
    });
  }

  [@override](/user/override)
  void dispose() {
    // 取消订阅以避免内存泄漏
    _stream.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Subscribed Stream Example"),
      ),
      body: Center(
        child: Text("Check the console for stream data"),
      ),
    );
  }
}

4. 订阅流

initState 方法中,你可以使用 _stream.subscribe 方法来订阅一个流。第一个参数是你想要订阅的流,第二个参数是一个回调函数,当流发出数据时会调用这个回调函数。

5. 取消订阅

dispose 方法中,调用 _stream.dispose 来取消订阅并释放资源。这是为了防止在 widget 被销毁后仍然持有流的引用,从而导致内存泄漏。

6. 使用 StreamBuilder

如果你想在 UI 中显示流的数据,你可以结合 StreamBuilder 使用 SubscribedStream

class MyWidget extends StatefulWidget {
  [@override](/user/override)
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  final SubscribedStream<int> _stream = SubscribedStream();

  [@override](/user/override)
  void initState() {
    super.initState();

    // 订阅一个流
    _stream.subscribe(Stream.periodic(Duration(seconds: 1), (count) => count), (data) {
      print("Received data: $data");
    });
  }

  [@override](/user/override)
  void dispose() {
    // 取消订阅以避免内存泄漏
    _stream.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Subscribed Stream Example"),
      ),
      body: Center(
        child: StreamBuilder<int>(
          stream: _stream.stream,
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              return Text("Current count: ${snapshot.data}");
            } else {
              return Text("Waiting for data...");
            }
          },
        ),
      ),
    );
  }
}
回到顶部