首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何让StreamBuilder停止监听事件

StreamBuilder是Flutter中用于监听流(Stream)事件并更新UI的一个Widget。要停止StreamBuilder监听事件,可以通过取消订阅(cancel subscription)来实现。

取消订阅可以通过StreamSubscription对象的cancel()方法来完成。当我们使用StreamBuilder监听一个流时,会返回一个StreamSubscription对象,我们可以将其保存在一个变量中,以便后续取消订阅。

以下是一个示例代码,演示如何停止StreamBuilder监听事件:

代码语言:txt
复制
import 'dart:async';
import 'package:flutter/material.dart';

class MyStreamBuilder extends StatefulWidget {
  @override
  _MyStreamBuilderState createState() => _MyStreamBuilderState();
}

class _MyStreamBuilderState extends State<MyStreamBuilder> {
  StreamController<int> _streamController;
  StreamSubscription<int> _subscription;
  int _data;

  @override
  void initState() {
    super.initState();
    _streamController = StreamController<int>();
    _subscription = _streamController.stream.listen((data) {
      setState(() {
        _data = data;
      });
    });
  }

  @override
  void dispose() {
    _subscription.cancel(); // 取消订阅,停止监听事件
    _streamController.close(); // 关闭流
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('StreamBuilder Example'),
      ),
      body: Center(
        child: StreamBuilder<int>(
          stream: _streamController.stream,
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              return Text('Data: ${snapshot.data}');
            } else {
              return Text('No data');
            }
          },
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          _streamController.sink.add(42); // 向流中添加数据
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

在上述示例中,我们创建了一个StreamController来管理流,并在initState()方法中使用stream.listen()方法订阅了该流。在dispose()方法中,我们调用_subscription.cancel()来停止监听事件,并调用_streamController.close()来关闭流。

这样,当我们不再需要监听事件时,可以通过调用dispose()方法来停止StreamBuilder的监听。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Flutter状态管理(2)——单Stream和广播Stream

    在Flutter状态管理(1)——InheritedWidget中介绍了状态管理以及如何使用InheritedWidget来实现全局状态的管理。这篇博客将介绍如何使用Stream来实现状态管理。...单订阅Stream只允许在该Stream的整个生命周期内使用单个监听器,即使第一个subscription被取消了,也无法在这个流上监听到第二次事件;而广播Stream允许任意个数的subscription...,可以随时随地给它添加subcontractor,只要新的监听开始工作流,它就能收到新的事件。...因为这依赖于监听者的存在,而如果这个监听的页面还没出现或不在内存中,那么该页面的数据从哪里来呢?...因为Stream是一旦消耗就没有了,因此如果那些还未出现的页面想消费一个已发送的事件,那只能是找某种方式将事件保存下来。这又会很麻烦,看来Stream的方式并不适合用在状态管理。

    2.3K41

    Flutter完整开发实战详解(十一、全面深入理解Stream)

    通俗来说,Stream 就是事件流或者管道,事件流相信大家并不陌生,简单的说就是:基于事件流驱动设计代码,然后监听订阅事件,并针对事件变换处理响应。...对象用于监听, 并且通过监听得到 StreamSubscription 管理事件订阅,最后在不需要时关闭即可,看起来是不是很简单?...stream 属性提供 Stream 对象的监听和变换,最后得到的 StreamSubscription 可以管理事件的订阅。...StreamSink:一般作为事件的入口,提供如 add , addStream 等。 Stream:事件源本身,一般可用于监听事件或者对事件进行转换,如 listen 、 where 。...,通过 data 缓存了当前数据和状态,那 StreamBuilder如何与 Stream 关联起来的呢?

    3.7K41

    Flutter ——状态管理 | StreamBuild

    Stream可以接受任何类型的数据,值、事件、对象、集合、映射、错误、甚至是另一个Stream,通过StreamController中的sink作为入口,往Stream中插入数据,然后通过你的自定义监听...单订阅Stream只允许在该Stream的整个生命周期内使用单个监听器,即使第一个subscription被取消了,你也没法在这个流上监听到第二次事件;而广播Stream允许任意个数的subscription...,你可以随时随地给它添加subscription,只要新的监听开始工作流,它就能收到新的事件。...###4.如何使用streamBuild? StreamBuilder( key: ...可选... stream: ...需要监听的stream......的监听StreamBuilder重建并刷新counter //步骤4.往StreamBuilder里添加流,数据变了,就用通知小部件 _streamController.sink.add

    2.9K31

    告别setState()! 优雅的UI与Model绑定 Flutter DataBus使用~

    如何优雅的解决这个问题,不得不提到StreamBuilder,StreamBuilder是Flutter中异步构建的核心组件。许多著名的开源框架例如Bloc皆是基于此实现。...从代码可知StreamBuilder接受两个参数,一个stream,表示我们监听的Stream(一个StreamBuilder监听一个Stream,但是一个Stream能被多个Widget监听),builder...在key1的点击事件中往Stream中add数据,这样在key1的流上产生了一条数据,对应的监听者收到数据后,只更新自己的内容,不会重建其他区域。 ? ? ?...---- 二、DataLine如何优化StreamBuilder的麻烦使用 经过上面的了解,我们知道。...我们注意到,StreamBuilder需要监听一个stream,而这个stream往往来自StreamControler。

    2.5K41

    事件驱动如何理解?什么场景下适合用?Python如何实现一个事件监听器?

    为达到解耦效果,引入了事件驱动模型:我们把“玩家升级”包装成一个事件,任何对这个事件感兴趣的“观察者”只需要监听并执行对应逻辑。事件驱动模型也就是我们常说的发布-订阅模型。...事件驱动主要包含这三类元素:事件源、事件监听器、事件对象;对应的操作函数中需要包括:监听动作、发送事件、调用监听器响应函数。...Steve 收到文章 正在阅读新文章内容:Python实现一个事件监听器 JOJO 收到文章 正在阅读新文章内容:Python实现一个事件监听器 addEventListener用来将事件监听器进行绑定...,检查是否存在该事件进行监听的处理函数,若存在则按顺序将事件传递给处理函数执行。...事件驱动:在一个单独的线程控制中,当处理I/O操作时,注册一个回调到事件循环中,回调中描述了如何处理某个事件,然后当I/O操作完成时继续执行。

    98020

    在 Flutter 中探索 StreamBuilderimage

    在这个博客中,我们将探索 Flutter 中的 StreamBuilder。我们还将实现一个演示程序,并向您展示如何在您的 Flutter 应用程序中使用 StreamBuilder。...介绍: StreamBuilder 可以监听公开的流,并返回小部件和捕获获得的流信息的快照。造溪者提出了两个论点。...如何在流上放置值是通过使用流控制器实现的。流构建器是一个小部件,它可以将用户定义的对象更改为流。...key: 小部件的键,用于控制小部件如何被另一个小部件取代 Stream? stream: 一个流,其快照可以通过生成器函数获得 T?...如果传递的值不为空,那么当 connectionState 在等待时,hasData 属性在任何事件中首先都将为 true StreamBuilder( initialData: 0, //

    2.5K00

    Flutter | 事件循环,Future

    需要注意的是使用完成之后要进行关闭操作,否则就会泄漏资源 并且 flutter 会一直警告, 上面的这种方式只能有一个监听,如果添加多个监听则就会保存,那么如何添加多个监听呢,可以使用广播的方式,如下...这两种方式就好像 EventBus 中的粘性事件 和 非粘性事件,每种都有它的作用另外, map 使用 map 还可以将事件进行改变或者修改,如下: controller.stream.map((event...13) .map((event) => "Map: $event") .listen((event) { print('$event'); }); distinct 去重,如何和上次的数据相同...做的小游戏 在日常开发中,StreamBuilder 还是挺实用的,这次我们用 StreamBuilder 来做一个小游戏,先看效果: 从上面的动画来看,可以将其分为三个部分,第一个部分则是底部的键盘...24)), ), ); }); } } Puzzle 也接收了输入和分数的 Stream,并且创建了一个动画,在 initState 中,监听动画和输入事件

    4.3K10

    Dart 异步

    Dart是基于事件循环机制的单线程模型 一条执行线上,同时且只能执行一个任务(事件),其他任务都必须在后面排队等待被执行。...2.2 Microtask Queue 微服务队列 MQ 微服务队列的优先级要高于EQ事件队列,Event Looper优先执行MQ队列中的事件,其次执行EQ事件队列中的事件 MQ 微服务队列中一般来自于...事件队列一般来自于外部事件任务,例如IO操作、计时器、点击、绘图等等 上面说过 如果微任务很多的话就有可能造成事件队列中的事件排不上对,可能会造成点击一个按钮没有反应造成阻塞,所以微服务不宜过多 另外一部分来源于...它是一个异步流,我们可以在代码中任何地方定义 Stream,然后在其他地方添加数据,Stream会监听到数据变化,并将改变后的数据传递给监听者。...使用 StreamBuilder是Flutter中的一个Widget,记录着流中最新的数据,当数据流发生变化时,会自动调用Builder进行重建 const StreamBuilder({ Key

    1.6K20

    Flutter 实践 MVVM

    StreamBuilder 上述的Stream和Sink还只是纯数据层面的,要想和UI相关的Widget关连起来,还有需要StreamBuilder的帮助。...StreamBuilder也是一个Widget,其作用就是监听指定的Stream,一旦这个Stream中有数据来了,就调用builder中的闭包,用新的数据,重新构建这个widget。...,使用broadcast可以多个流监听同一个Sink。...,在stream参数给上我们ViewModel的output stream,也就是说当ViewModel中的Sink对象被add数据后,StreamBuilder监听到这个变化,然后重新通过builder...需要注意的是,这里虽然只用了一个StreamBuilder,但是不代表一个页面只能用一个StreamBuilder,每个想要单独监听某个Stream的widget外面都是wrap一个StreamBuilder

    10K70

    FlutterDojo设计之道—状态管理之路(三)

    下面将官方的counter demo,用BLoC模式重写下,大家了解下创建BLoC模式的一般范式。...IncrementBloc就是这个业务的处理核心,通过Stream,外界可以监听数据的改变。 一个标准的BLoC类通常包含下面几个部分。...在UI层中,需要做的就是通过StreamBuilder来解析要监听的数据,StreamBuilder的builder函数是一个AsyncWidgetBuilder,它能够异步构建widget,其参数AsyncSnapshot...BLoC流的单播与广播 Flutter中的Stream分为两种,单播与多播,默认情况下创建的是单播Stream,这样的话,只能有一个StreamBuilder监听,如果存在多个StreamBuilder...举个例子,比如在第一个界面在流中添加了一些数据,再打开第二个界面的时候,创建StreamBuilder之后,是无法直接获取流的最新数据的,因为这时候流中的的数据在StreamBuilder监听之前就已经结束了

    1.6K30
    领券