【问题标题】:How to tell a StreamBuilder that I'm retrying to load data after an error如何告诉 StreamBuilder 我在出错后重试加载数据
【发布时间】: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


【解决方案1】:

你可以使用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

【讨论】:

  • 我玩过connectionstate,但无法获得我想要的行为,我在等待时返回了旋转加载器(工作正常),但是当它出现错误时,我相信状态会改变主动。但我想要的是当我按下重试按钮时将状态更改回等待,这样我就可以显示正在旋转的装载机。
  • 报错时是不是没有进入if(snapshot.hasError)?
  • 是的,但是在出错后无法显示加载器(使用连接状态)。
  • 你为什么不用CircularProgressIndicator()?这将显示一个加载器..
  • 你尝试使用CircularProgressIndicator()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 2015-07-22
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
相关资源
最近更新 更多