有没有一种方法可以暂停streambuilder并以编程方式启动它



我有一个streambuilder,它连接到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,
),
),
],
);

}
}

}),
stream _yourSteam = Stream.fromFuture(_operation(_searchTerm)),
void pauseStream(){
_yourSteam.listen((event) { }).pause();
}

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

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,
),
),
],
);

}
}

}),

如果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();

最新更新