问题很简单,但我找不到合适的解决方案。我有一个搜索屏幕,这就是我想要做的。
- 第一次启动屏幕时,我想在
Text
小部件中显示一条消息“您的结果将出现在此处”。 - 如果用户在搜索框中输入内容并按搜索,我想显示
CircularProgressIndicator
. - 然后,当收到 API 响应时,我想显示
ListView
或Text
说“什么也没找到”。 - 如果用户再次搜索某些内容,我想
CircularProgressIndicator
再次显示。
如何使用 实现这种行为Stream
?以下是我到目前为止的代码:
小部件
StreamBuilder<List<Model>>(
stream: bloc.searchStream,
builder: (context, snapshot) {
if (snapshot.hasError) {
return Center(
child: Text(
'Error occurred'
),
);
}
if (!snapshot.hasData) {
return Center(
child: Text(
'Your results will appear here'
),
);
}
if (snapshot.hasData && snapshot.data.length < 1) {
return Center(
child: Text(
'Found nothing'
),
);
}
// Where should I put my CircularProgressIndicator?
return ListView.separated(
itemCount: snapshot.data.length,
separatorBuilder: (context, index) => Divider(height: 1),
itemBuilder: (context, index) {
final item = snapshot.data[index];
return ItemWidget(item);
},
);
},
)
集团
final _searchStreamController = StreamController<List<Model>>();
Stream<List<Model>> get searchStream => _searchStreamController.stream;
void search(String searchTerm) async {
if (searchTerm.isEmpty) {
_searchStreamController.add(null);
return;
}
final client = HttpClient();
client.method = HttpMethod.POST;
client.endPoint = 'search';
client.addData('query', searchTerm);
try {
final responseStr = await client.execute();
final response = SearchResponse.fromJson(responseStr);
_searchStreamController.add(response.data);
} catch (e) {
_searchStreamController.addError(e);
}
}
我想在CircularProgressIndicator
每次search(String searchedTerm)
调用函数时显示。
谢谢你。