Как сообщить StreamBuilder, что я пытаюсь загрузить данные после ошибки - PullRequest
0 голосов
/ 24 января 2020

У меня есть потоковый конструктор для загрузки списка видео постов. Всякий раз, когда возникает ошибка, я добавляю ошибку в приемник, и 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);
    }
  }

1 Ответ

0 голосов
/ 24 января 2020

Вы можете использовать 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

...