【问题标题】:Is there a way to pause streambuilder and start it programmatically有没有办法暂停streambuilder并以编程方式启动它
【发布时间】:2020-11-29 19:49:42
【问题描述】:

我有一个连接到 Algolia 以将数据带回我的搜索页面的流构建器,我的问题是,当它找到数据时,即使用户没有输入,它也会不断刷新结果,我认为这对于用户,我需要它在找到数据时暂停,仅在用户开始输入时刷新,以便用户有时间阅读他的结果

这是我的代码

StreamBuilder < List < AlgoliaObjectSnapshot >> (
    stream: Stream.fromFuture(_operation(_searchTerm)),
    builder: (context, snapshot) {
        if (!snapshot.hasData) return Text("Start Typing", style: TextStyle(color: Colors.white), );
        else {
            List < AlgoliaObjectSnapshot > currSearchStuff = snapshot.data;

            switch (snapshot.connectionState) {
                case ConnectionState.waiting:
                    return Container(child: CircularProgressIndicator());
                default:
                    if (snapshot.hasError)
                        return new Text('Error: ${snapshot.error}');
                    else
                        return CustomScrollView(shrinkWrap: true,
                            slivers: < Widget > [
                                SliverList(
                                    delegate: SliverChildBuilderDelegate(
                                        (context, index) {
                                            return _searchTerm.length > 0 ? DisplaySearchResult(artDes: currSearchStuff[index].data["name"], artistName: currSearchStuff[index].data["price"].toString(), genre: currSearchStuff[index].data["quantity"].toString(), ) :
                                                Container();

                                        },
                                        childCount: currSearchStuff.length ?? 0,
                                    ),
                                ),
                            ],
                        );


            }
        }


    }),

【问题讨论】:

    标签: android firebase flutter dart algolia


    【解决方案1】:
    stream _yourSteam = Stream.fromFuture(_operation(_searchTerm)),
    void pauseStream(){
    _yourSteam.listen((event) { }).pause();
    }
    

    我从未使用过这种类型的流,但测试可能会回答

    StreamBuilder < List < AlgoliaObjectSnapshot >> (
        stream: _yourSteam,
        builder: (context, snapshot) {
            if (!snapshot.hasData) return Text("Start Typing", style: TextStyle(color: Colors.white), );
            else {
                List < AlgoliaObjectSnapshot > currSearchStuff = snapshot.data;
    
                switch (snapshot.connectionState) {
                    case ConnectionState.waiting:
                        return Container(child: CircularProgressIndicator());
                    default:
                        if (snapshot.hasError)
                            return new Text('Error: ${snapshot.error}');
                        else
                            return CustomScrollView(shrinkWrap: true,
                                slivers: < Widget > [
                                    SliverList(
                                        delegate: SliverChildBuilderDelegate(
                                            (context, index) {
                                                return _searchTerm.length > 0 ? DisplaySearchResult(artDes: currSearchStuff[index].data["name"], artistName: currSearchStuff[index].data["price"].toString(), genre: currSearchStuff[index].data["quantity"].toString(), ) :
                                                    Container();
    
                                            },
                                            childCount: currSearchStuff.length ?? 0,
                                        ),
                                    ),
                                ],
                            );
    
    
                }
            }
    
    
        }),
    

    【讨论】:

      【解决方案2】:

      如果 algolia 在没有输入的情况下向您显示结果,则您必须控制结果的流式传输方式,即使您计划暂停流式传输,当您恢复流式传输时,一切都会完成(因为流式传输结果在暂停时被缓冲),我会这样接近它

      class Search{
          bool _shouldEmit = true;
      
        void pause(){
          _shouldEmit = false;
        }
        void resume (){
          _shouldEmit = true;
        }
        
        Stream<dynamic> searchFor(String searchTerm) async*{
         final results = _operation(searchTerm);//your future operation
         await for(final result in results){
           if(_shouldEmit){
             yield result;
           }
         }
        }
      }
      

      这样使用

      final mySearch = Search();
      final theStream = mySearch.searchFor("keanu reeves");
      ///listen to the stream or pause when needed
      mySearch.pause();
      

      【讨论】:

      • 谢谢,让我试试这个,我怎么知道用户何时完成输入,以便我可以暂停流并仅在他们开始输入时启动流
      猜你喜欢
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      • 1970-01-01
      • 2012-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多