【发布时间】:2020-05-10 15:36:36
【问题描述】:
我有一个用于加载视频帖子列表的流生成器。每当发生错误时,我都会将错误添加到接收器,StreamBuilder 会显示带有“重试”按钮的错误消息。我的问题是,当我按下按钮时,什么都没有发生(视觉上),但我想在重试时用 spinningLoader 替换错误消息。
我将如何实现这一目标?
我正在考虑向接收器添加一个布尔值并检查 snapshot.data 是否为布尔值,如果是则返回 spinLoader,但这似乎违反直觉。
@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);
}
}
【问题讨论】:
-
AsyncSnapshot 有一个
connectionState属性,它会告诉你它是否是waiting or done。这应该可以帮助您处理显示加载屏幕。 -
我做了一些测试,当错误被添加到接收器时,等待状态似乎结束了。因此,当我按下重试按钮时,它会在后台获取帖子,但该按钮仍会显示。如何让它再次进入等待状态?
-
我以前解决这个问题的一种方法是创建一个抽象的
State类并将其添加到流中。因此,不是流返回List<String>,而是返回SuccessState的实例,该实例具有results类型为List<String>的属性,然后在重试时,您可以将LoadingState的实例添加到流中并显示加载微调器. -
@JordanDavies 我喜欢这听起来,我要实现它,谢谢。
标签: flutter dart stream stream-builder