【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),
                ))
          ],
        ),
      ),
    );
  }
}
相关推荐
2601_9495758643 分钟前
Flutter for OpenHarmony二手物品置换App实战 - 项目总结
flutter
●VON2 小时前
Flutter for OpenHarmony:基于可选描述字段与上下文感知渲染的 TodoList 任务详情子系统实现
学习·flutter·架构·交互·von
雨季6662 小时前
构建 OpenHarmony 简易单位换算器:用基础运算实现可靠转换
flutter·ui·自动化·dart
一起养小猫2 小时前
Flutter for OpenHarmony 实战:贪吃蛇游戏核心架构设计
flutter·游戏
无穷小亮2 小时前
Flutter框架跨平台鸿蒙开发——育儿知识APP的开发流程
flutter·华为·harmonyos·鸿蒙
嘴贱欠吻!3 小时前
Flutter鸿蒙开发指南(四):主页Tab栏实现
flutter
雨季6664 小时前
构建 OpenHarmony 跨设备任务协同中心:Flutter 实现多端任务流转与状态同步
flutter
●VON5 小时前
Flutter for OpenHarmony:基于可空截止日期与时间语义可视化的 TodoList 时间管理子系统实现
安全·flutter·交互·openharmony·跨平台开发
晚霞的不甘5 小时前
Flutter for OpenHarmony 引力弹球游戏开发全解析:从零构建一个交互式物理小游戏
前端·flutter·云原生·前端框架·游戏引擎·harmonyos·骨骼绑定
雨季6665 小时前
构建 OpenHarmony 智能场景自动化配置面板:Flutter 实现可视化规则编排
运维·flutter·自动化