Flutter “重建事业”;溪流已经听过了;

Flutter “重建事业”;溪流已经听过了;,flutter,dart,rxdart,Flutter,Dart,Rxdart,我有一个BehaviorSubject,每当我键入文本字段时,它都会从Firebase查询中发出一个项目列表,就像全文搜索一样。 我使用一个StreamBuilder(在ListView中)来监听这个流,并在一个用AnimatedSwitcher包装的列中显示所有列表项 当我试图滚动视图或当列刷新时,我得到“流已经被监听”。我什么都试过了,但没能修好 编辑:我添加了一些代码 视图.省道 PostController _postController = new PostController();

我有一个BehaviorSubject,每当我键入文本字段时,它都会从Firebase查询中发出一个项目列表,就像全文搜索一样。 我使用一个StreamBuilder(在ListView中)来监听这个流,并在一个用AnimatedSwitcher包装的列中显示所有列表项

当我试图滚动视图或当列刷新时,我得到“流已经被监听”。我什么都试过了,但没能修好

编辑:我添加了一些代码

视图.省道

PostController _postController = new PostController();

ListView(
    padding: EdgeInsets.all(12),
    children: <Widget>[

      //titolo
      Container(
        decoration: BoxDecoration(
          borderRadius: BorderRadius.all(Radius.circular(10)),
          color: Color.fromRGBO(242, 242, 242, 1),
        ),
        padding: EdgeInsets.all(8),
        child: Column( 
          children: <Widget>[
            StreamBuilder(
              stream: _postController.titleStream$,
              builder: (BuildContext context, AsyncSnapshot<String> snap) {
                return TextField(
                  onChanged: (String search) => _postController.updateTitle(search),
                  decoration: InputDecoration(
                    contentPadding: EdgeInsets.all(12),
                    border: InputBorder.none,
                    fillColor: Colors.transparent,
                    filled: true,
                    hintText: "titolo",
                    errorText: snap.error
                  ),
                  style: TextStyle(color: Colors.black, fontWeight: FontWeight.bold, fontSize: 24),
                );
              },
            ),

            StreamBuilder(
              stream: _postController.superStream,
              builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snap){
                return AnimatedSwitcher(
                  duration: Duration(milliseconds: 500),
                  transitionBuilder: (child, animation) => SizeTransition(sizeFactor: animation, child: child, axisAlignment: -1,),
                  child: snap.hasData ? BuildQuestions(snap.data.documents) : Container(width: 0, height: 0)
                );
              },
            ),
PostController\u PostController=new PostController();
列表视图(
填充:边缘设置。全部(12),
儿童:[
//提托洛
容器(
装饰:盒子装饰(
borderRadius:borderRadius.all(半径圆形(10)),
颜色:color.fromRGBO(242,242,242,1),
),
填充:边缘设置。全部(8),
子栏(
儿童:[
StreamBuilder(
流:_postController.titleStream$,
生成器:(BuildContext上下文,异步快照快照){
返回文本字段(
onChanged:(字符串搜索)=>\u postController.updateTitle(搜索),
装饰:输入装饰(
contentPadding:EdgeInsets.all(12),
边框:InputBorder.none,
fillColor:Colors.transparent,
是的,
hintText:“蒂托洛”,
errorText:snap.error
),
样式:TextStyle(颜色:Colors.black,fontwweight:fontwweight.bold,fontSize:24),
);
},
),
StreamBuilder(
流:_postController.superStream,
生成器:(BuildContext上下文,异步快照快照){
返回动画切换器(
持续时间:持续时间(毫秒:500),
transitionBuilder:(子对象,动画)=>SizeTransition(SizeActor:animation,子对象:子对象,axisAlignment:-1,),
子:snap.hasData?BuildQuestions(snap.data.documents):容器(宽度:0,高度:0)
);
},
),
后置控制器

BehaviorSubject _titleController = new BehaviorSubject<String>();
Observable<String> get titleStream$ => 
_titleController.stream.transform(_validateTitle); //if string is not empty it emits otherwise it emits an error
String get title => _titleController.value;
void updateTitle(String title) => _titleController.add(title);

Observable<QuerySnapshot> get superStream => Observable.combineLatest2(
  titleStream$, 
  Queries.search(_titleController.value), //search stream from firestore api
  (String title, QuerySnapshot snap) => snap
);
BehaviorSubject\u titleController=newbehaviorsubject();
可观察的获取标题流$=>
_titleController.stream.transform(_validateTitle);//如果字符串不是空的,则发出错误
字符串get title=>\u titleController.value;
void updateTitle(字符串标题)=>\u titleController.add(标题);
Observable get superStream=>Observable.CombineRelatest2(
标题流$,
querys.search(_titleController.value),//从firestore api搜索流
(字符串标题,QuerySnapshot捕捉)=>捕捉
);
已解决

我在一个StreamBuilder中有一个submit按钮,它正在侦听另一个可观察到的内容,我用它来检查表单的字段是否为空。当我键入TextField并显示列时,submit按钮滑出视图,当我向下滚动时,StreamBuilder将被重建并再次尝试侦听他的流这就产生了错误。 解决方法:

Observable<bool> get validate => Observable.combineLatest2(titleStream$, descriptionStream$, (t, d) => true).asBroadcastStream();
Observable get validate=>Observable.CombineRelateTest2(titleStream$,descriptionStream$,(t,d)=>true).asBroadcastStream();

将您的流声明为广播流,如下所示

我使用rxdart,您应该根据您的场景修改它

  static var controller =StreamController<Map<String, dynamic>>();
  static var _streamObservable = Observable(controller.stream.asBroadcastStream());
static var controller=StreamController();
静态变量_streamObservable=Observable(controller.stream.asBroadcastStream());

请您分享一些代码,以便我们可以帮助您。@Muldec添加了一些代码我已经在Behavior Subject中使用了rxdart,正如我在问题中提到的,默认情况下它是一个广播流。尽管如此,我还是尝试了,但仍然出现了相同的错误