我有一个流生成器,用于加载视频帖子列表。每当发生错误时,我都会向接收器添加错误,并且StreamBuilder会显示错误消息,并带有“重试”按钮。我的问题是,当我按下按钮时,什么都没有(在视觉上)发生,但是我想在重试时用spinningLoader替换错误消息。
我将如何实现?
[我当时想在接收器中添加一个布尔值,并检查snapshot.data是否为bool,然后返回它是否为spinningLoader,但这似乎违反直觉。
@override
Widget build(BuildContext context) {
return SafeArea(
child: Container(
color: backgroundColor,
child: StreamBuilder(
stream: _streamController.stream,
builder: (context, snapshot) {
if (snapshot.hasData) {
return buildRelatedList(snapshot.data);
} else if (snapshot.hasError) {
return retryButton();
} else {
return _spinningLoader;
}
},
),
),
);
}
_fetchVideos() async {
List videos = await RelatedVideos.fetchVideos(
id: widget.id);
if (videos.isEmpty) {
_streamController.sink.addError('error loading');
} else {
_streamController.sink.add(videos);
}
}
您可以使用ConnectionState
:
builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
if (snapshot.hasError)
return Text('Error: ${snapshot.error}');
switch (snapshot.connectionState) {
case ConnectionState.none: return Text('Select lot');
case ConnectionState.waiting: return Text('Awaiting bids...');
case ConnectionState.active: return Text('\$${snapshot.data}');
case ConnectionState.done: return Text('\$${snapshot.data} (closed)');
}
return null; // unreachable
},
)
将连接状态返回到异步计算。您也可以将Text
小部件更改为另一个小部件,例如,您可以使用CircularProgressIndicator();
https://api.flutter.dev/flutter/widgets/ConnectionState-class.html
https://api.flutter.dev/flutter/widgets/StreamBuilder-class.html
https://api.flutter.dev/flutter/widgets/StreamBuilder-class.html