Dart 先前添加的流值在收听时返回(广播流)

Dart 先前添加的流值在收听时返回(广播流),dart,Dart,我有一个定制的StreamController: 在发出该值之后,我设置了一个流侦听器 预期的行为是侦听器将返回先前设置的值,但是,情况并非如此。只有在设置了侦听器之后设置了值,才会调用侦听器 我怎样才能做到这一点 (编辑:必须支持多个侦听器)首先,不要将流设为a,因为此类流的定义是允许多个订阅者,但如果没有当前订阅者,则所有事件都将丢失 然后,查看从流控制器返回的流上的。此方法允许在第一个订阅者之后第一次监听流的情况下实现逻辑,并且还允许在没有订阅者的情况下进行暂停流之类的逻辑。您可以使用St

我有一个定制的
StreamController

在发出该值之后,我设置了一个
侦听器

预期的行为是侦听器将返回先前设置的值,但是,情况并非如此。只有在设置了侦听器之后设置了值,才会调用侦听器

我怎样才能做到这一点


(编辑:必须支持多个侦听器)

首先,不要将
流设为a,因为此类流的定义是允许多个订阅者,但如果没有当前订阅者,则所有事件都将丢失


然后,查看从
流控制器
返回的
上的。此方法允许在第一个订阅者之后第一次监听流的情况下实现逻辑,并且还允许在没有订阅者的情况下进行暂停流之类的逻辑。

您可以使用
StreamController
onListen
回调,因为每次有人调用它时都会调用它订阅

class StreamExample {
  late final StreamController<dynamic> _controller;
  dynamic _val;

  StreamExample() {
    _controller = StreamController.broadcast();
    _controller.onListen = () => _controller.add(_val);
  }

  /// Example setter for value which works 
  /// like [ChangeNotifier] for [Stream] listeners.
  void set val(value) {
    _val = value;
    _controller.add(value);
  }

  Stream<dynamic> get stream => _controller.stream;
}
类流示例{
后期最终流量控制器_控制器;
动态值;
示例(){
_controller=StreamController.broadcast();
_controller.onListen=()=>\u controller.add(\u val);
}
///有效值的示例设置器
///类似于[Stream]侦听器的[ChangeNotifier]。
无效设置值(值){
_val=值;
_控制器。添加(值);
}
Stream get Stream=>\u controller.Stream;
}

是否将流设置为广播流?广播的目的是允许多个侦听器,但如果没有侦听器,这也会丢弃任何事件:@julemand101好的,很好的解决方案,这很有效。但是,另一个要求是可以有多个侦听器。如果您有一个解决方案,请考虑写一个答案:“也许调用<代码> ASBaskStase<代码> > <代码>流>代码>从<代码> StreamController < /代码>返回:“返回的流将在添加其第一个订户时订阅此流,并将保持订阅状态,直到此流结束,或回调取消订阅。“但是,是的,如果您在某个时候返回到零订户,事件将再次被丢弃。另一种解决方案是手动制作一些东西,您可以自己控制订阅者列表,如果没有订阅者,则将事件放入缓冲区。实际上,
asBroadcastStream
:例如,使用回调在没有订阅服务器时暂停基础订阅,以防止丢失事件,或者在没有侦听器时取消订阅。“这只适用于第一个侦听器。流控制器以前是广播控制器的原因是,它需要多个侦听器同时侦听,这些侦听器在开始侦听时都应该接收事件。无论您使用的是
asBroadcastStream
还是广播控制器,这都无关紧要。一个合适的选择是RxDart,这个类正是我一直要求的工作
listener.add(7);
listener.stream.listen((val) {
    print(val);
});
class StreamExample {
  late final StreamController<dynamic> _controller;
  dynamic _val;

  StreamExample() {
    _controller = StreamController.broadcast();
    _controller.onListen = () => _controller.add(_val);
  }

  /// Example setter for value which works 
  /// like [ChangeNotifier] for [Stream] listeners.
  void set val(value) {
    _val = value;
    _controller.add(value);
  }

  Stream<dynamic> get stream => _controller.stream;
}