Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter ScanStreamTransformer替代方案';每个事件调用一次,而不是每个侦听器调用一次_Flutter_Dart_Rxdart - Fatal编程技术网

Flutter ScanStreamTransformer替代方案';每个事件调用一次,而不是每个侦听器调用一次

Flutter ScanStreamTransformer替代方案';每个事件调用一次,而不是每个侦听器调用一次,flutter,dart,rxdart,Flutter,Dart,Rxdart,我想,现在我看到了Bloc.dart类中关于transform()的情况。在BloC.dart的构造函数中,对每个侦听器调用一次(在One.dart类中有3个侦听器,因此调用了3次)。我想更改此行为,使其在每个事件中调用一次,而不管附加了多少侦听器。例如,调用\u mainBloc.inValue(widget.value)将只调用transform一次,现在调用它三次,因为One.dartbuild()中有三个侦听器(请参见streamBuilder())功能 我希望这比以前的帖子(现在被删除

我想,现在我看到了
Bloc.dart
类中关于
transform()
的情况。在
BloC.dart
的构造函数中,对每个侦听器调用一次(在
One.dart
类中有3个侦听器,因此调用了3次)。我想更改此行为,使其在每个事件中调用一次,而不管附加了多少侦听器。例如,调用
\u mainBloc.inValue(widget.value)
将只调用transform一次,现在调用它三次,因为
One.dart
build()中有三个侦听器(请参见
streamBuilder()
)功能

我希望这比以前的帖子(现在被删除)更清晰一点

class OneState扩展了状态{
@凌驾
void didChangeDependencies(){
super.didChangeDependencies();
_mainBloc.inValue(widget.value);
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(),
正文:专栏(
儿童:[
streamBuilder(),
streamBuilder(),
streamBuilder()
],
),
);
}
streamBuilder(){
返回流生成器(
流:_mainBloc.values$,
生成器:(上下文,异步快照){
if(snapshot.connectionState==connectionState.waiting)返回中心(child:Container(child:new CircularProgressIndicator());
if(!snapshot.hasData)返回中心(子:容器(子:文本(“无数据”),);
回归未来建设者(
未来:snapshot.data[widget.value],
生成器:(contextFuture、AsyncSnapshot snapshotFuture){
if(snapshotFuture.connectionState==connectionState.waiting)
返回中心(子对象:容器(子对象:new CircularProgressIndicator());
返回中心(
子:容器(
子项:文本(snapshotFuture.data),
),
);
},
);
},
);
}
}
集团

class MainBloc{
最终API请求-供应商;
MainBloc(此.\u提供程序){
值$=\u value.stream.transform(
ScanStreamTransformer((映射缓存、字符串符号、索引){
打印(“变压器”);
cache[symbol]=“u provider.fetchData();
返回缓存;
},
{},
));
}
最终_值=行为主体();
可观测值$;
函数(字符串符号)get inValue=>\u value.sink.add;
处置{
_value.close();
}
}

添加一个
.asBroadcastStream()
。比如:

values$ =_value.stream.transform(
        ScanStreamTransformer((Map<String, Future<String>> cache, String symbol, index){
          print('transformer');
          cache[symbol] = _provider.fetchData();
          return cache;
        },
          <String, Future<String>>{},
        )).asBroadcastStream();
values$=\u value.stream.transform(
ScanStreamTransformer((映射缓存、字符串符号、索引){
打印(“变压器”);
cache[symbol]=“u provider.fetchData();
返回缓存;
},
{},
)).asBroadcastStream();

它应该停止三次调用。

使用
StreamBuilder
+
FutureBuilder
组合的目的是什么?你想要实现什么?也许
ScanStreamTransformer
不是您真正需要的?我有一个显示“用户”信息的有状态小部件,该类将用户名作为参数,在类内,使用用户名作为唯一id从服务器获取数据。类具有多个streambuilder。在transformer()中使用映射的原因是为了防止屏幕显示不正确的数据-当屏幕加载时,它会显示“旧”用户信息和“当前”用户,从而导致屏幕包含部分属于不同用户对象的数据,而如果缓存用户,则我可以执行以下操作:例如
snapshotFuture.data[用户名]
这似乎显示了特定用户的全部数据。我的意思是,您应该只使用
SteeamBuilder
,并提供正确的
,以提供完整的数据(而不是中间的
未来
s)有时,流保存旧用户对象,并在获取新对象之前显示旧用户对象。请参阅
asyncMqp
或类似方法
class MainBloc{
  final ApiRequest _provider;

  MainBloc(this._provider){
    values$ = _value.stream.transform(
        ScanStreamTransformer((Map<String, Future<String>> cache, String symbol, index){
          print('transformer');
          cache[symbol] = _provider.fetchData();
          return cache;
        },
          <String, Future<String>>{},
        ));
  }

  final _value = BehaviorSubject<String>();

  Observable<Map<String, Future<String>>> values$;

  Function(String symbol) get inValue => _value.sink.add;


  dispose(){
    _value.close();
  }

}
values$ =_value.stream.transform(
        ScanStreamTransformer((Map<String, Future<String>> cache, String symbol, index){
          print('transformer');
          cache[symbol] = _provider.fetchData();
          return cache;
        },
          <String, Future<String>>{},
        )).asBroadcastStream();