【Flutter】合并多个流Stream

1.说明

无意间发现了一个好用的库rxdart,它为 Dart 的 Stream 添加了额外的功能。

2.功能

(1)合并多个流Stream

借助Rx.combineLatest2()合并两个流stream1和stream2

注意:如果dart文件中同时使用了getx,需要隐藏掉Rx,否则会冲突。

dart 复制代码
import 'dart:async';

import 'package:flutter/material.dart';
import 'package:rxdart/rxdart.dart';
// import 'package:get/get.dart' hide Rx;

// Library: rxdart , v0.28.0
// 为 Dart 的 Stream 添加了额外的功能
// 合并多个流 CombineLatestStream

// Publisher: fluttercommunity.dev

class RxdartDemo extends StatefulWidget {
  const RxdartDemo({super.key});

  @override
  State<RxdartDemo> createState() => _RxdartDemoState();
}

class _RxdartDemoState extends State<RxdartDemo> {
  //(热重载报错) Unhandled Exception: Bad state: Stream has already been listened to.
  // 解决:更改为广播流(broadcast)。
  StreamController<String> streamController1 = StreamController<String>.broadcast();
  late Stream<String> stream1;

  StreamController<int> streamController2 = StreamController<int>.broadcast();
  late Stream<int> stream2;

  StreamController<List<int>> streamController3 = StreamController<List<int>>.broadcast();
  late Stream<List<int>> stream3;

  @override
  void initState() {
    super.initState();

    stream1 = streamController1.stream;
    streamController1.add("A");

    stream2 = streamController2.stream;
    streamController2.add(1);

    stream3 = streamController3.stream;
    streamController3.add([1, 2]);
  }

  @override
  void dispose() {
    streamController1.close();
    streamController2.close();
    streamController3.close();

    super.dispose();
  }

  // Rx.combineLatest2 将两个Stream流合并
  Stream<String> get streamCombined =>
      Rx.combineLatest2(stream1, stream2, (a, b) => '$a - $b');

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Text(
              "单个流Stream",
              style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
            ),
            const SizedBox(
              height: 12,
            ),
            StreamBuilder<List<int>>(
                stream: stream3,
                builder: (context, snapshot) {
                  return Text(
                    "${snapshot.data}",
                    style: const TextStyle(fontSize: 16),
                  );
                }),
            const SizedBox(
              height: 12,
            ),
            const Text(
              "合并多个流Stream",
              style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
            ),
            const SizedBox(
              height: 12,
            ),
            StreamBuilder<String>(
                stream: streamCombined,
                builder: (context, snapshot) {
                  return Text(
                    snapshot.data ?? 'empty',
                    style: const TextStyle(fontSize: 16),
                  );
                }),
            TextButton(
                onPressed: () {
                  streamController1.add("b");
                  streamController2.add(2);
                  streamController3.add([3, 4]);
                },
                child: const Text(
                  'Change',
                  style: TextStyle(fontSize: 16, color: Colors.blue),
                ))
          ],
        ),
      ),
    );
  }
}
相关推荐
恋猫de小郭1 小时前
AI 时代,也许你的 Flutter 需要一套 Dartastic OpenTelemetry 监控
android·前端·flutter
等....2 小时前
Flutter创建
flutter
Privasa-隐私实验室2 小时前
跨端技术选型|Flutter搭建隐私加密App,安卓与iOS双端差异适配实战
android·笔记·安全·flutter·ios·隐私安全·aes-256
Flutter OH12 小时前
Flutter OH 外接纹理问题定位指南
flutter
未来猫咪花17 小时前
Everything is ViewModel:让状态管理回到对象世界
android·flutter·ios
Flutter OH18 小时前
Flutter OH 日志抓取与过滤指南
flutter
Flutter OH18 小时前
Flutter OH 内存与 GPU 问题定位指南
flutter
Flutter OH19 小时前
Flutter OH 多设备适配问题定位指南
flutter
律宏阔20 小时前
Flutter Hooks 与 flutter_map_animations 冲突:第二次地图动画报错的解决方案
flutter
Flutter OH1 天前
Flutter OH 卡死冻屏问题定位指南
flutter·命令模式