BehaviorSubject 添加相同的值

Posted

技术标签:

【中文标题】BehaviorSubject 添加相同的值【英文标题】:BehaviorSubject adding the same value 【发布时间】:2021-03-17 11:03:45 【问题描述】:

嗨,我有一个简单类型 int 的 BehaviorSubject,我将值 5 添加到它,然后添加另一个值 5。流侦听器向我发送了两个事件。 如果值等于最后一个值,如何强制检查值而不发送事件。 示例代码:

    class TestBloc 
  TestBloc()
    testBehavior.stream.listen((event) 
      print('Event value = $event');
    );
    addValueToStream();
    addValueToStream();
  

  final testBehavior = BehaviorSubject<int>();

  void addValueToStream() 
    testBehavior.add(5);
  

【问题讨论】:

【参考方案1】:

你要找的是BehaviorSubject()distinct()方法。

从文档中查看:

如果数据事件等于前一个数据事件,则跳过它们。

返回的流提供与此流相同的事件,除了 它永远不会提供两个相等的连续数据事件。 也就是说,错误被传递到返回的流中,并且数据 如果事件与最近的事件不同,则通过事件 发出数据事件。

下面是你如何实现它:

class TestBloc 
  TestBloc() 
    testBehavior.distinct((a, b) => a == b).listen((event) 
      print('Event value = $event');
    );
    addValueToStream();
    addValueToStream();
  

  final testBehavior = BehaviorSubject<int>();

  void addValueToStream() 
    testBehavior.add(5);
  

【讨论】:

嗨,@Stewie Griffin。对我来说很奇怪,需要为流使用一些额外的功能来不将相同的值发送到流。但它工作正常,谢谢。也许有些人需要了解如何在 StreamBuilder 中使用它:StreamBuilder&lt;int&gt;( stream: bloc.myStream.distinct((a, b) =&gt; a == b), builder: (context, snapshot) ) 但是在 bloc 类的流中使用它更酷final myBeh = BehaviorSubject&lt;int&gt;(); Stream&lt;int&gt; get myStream =&gt; myBeh.stream.distinct((a, b) =&gt; a == b);

以上是关于BehaviorSubject 添加相同的值的主要内容,如果未能解决你的问题,请参考以下文章

使用 BehaviorSubject 的测试中的 TimeoutException - BLoC

将数组中的值附加到 BehaviorSubject

node_modules 没有导出的成员 'BehaviorSubject'

优化算法蜂虎狩猎 (BEH) 算法含Matlab源码 2278期

RxJS - BehaviorSubject,onComplete 未调用

延迟Rxjs BehaviorSubject机制