Flutter FutureBuilder hasData и connectionState - PullRequest
0 голосов
/ 07 февраля 2020

В статье Извлечение данных из целого rnet показывает следующий фрагмент кода для FutureBuilder для обработки snapshot.

FutureBuilder<Post>(
  future: post,
  builder: (context, snapshot) {
    if (snapshot.hasData) {
      return Text(snapshot.data.title);
    } else if (snapshot.hasError) {
      return Text("${snapshot.error}");
    }

    // By default, show a loading spinner.
    return CircularProgressIndicator();
  },
);

This просто не кажется достаточно 1017 *. Не может ли быть случаев, когда snapshot.connectionState равен ConnectionState.done, но оба snapshot.hasData и snapshot.hasError равны false? Будущее может законно вернуть null в качестве своего результата. Приведенный выше фрагмент неправильно отображал бы индикатор загрузки на неопределенный срок, не так ли?

1 Ответ

1 голос
/ 07 февраля 2020

Согласно документации, snapshot.hasData

Возвращает, содержит ли этот снимок ненулевое значение данных.

Это может быть ложно, даже если асинхронное вычисление завершилось успешно, если вычисление не вернуло ненулевое значение. Например, Future завершится с нулевым значением, даже если оно завершится успешно.

Таким образом, snapshot.hasData вернет false при получении нулевого значения, подтверждая ваши мысли в вашем вопросе.

snapshot.hasError

Возвращает, содержит ли этот снимок ненулевое значение ошибки.

Это всегда верно, если последний результат асинхронного вычисления был неудачным .

Ненулевое значение ошибки получается, когда сервер отвечает с состоянием, которое указывает на сбой, такой как 404, 500 с объектом ошибки , сопровождающим моментальный снимок или что-то еще возвращенное из операции

snapshot.hasError будет ложным при неудавшемся запросе или в случае, когда запрос даже не был выполнен (в случае отсутствия сети или плохой сети), и ответ имеет ненулевое значение (будет объект ошибки , прикрепленный к моментальному снимку при ConnectionState.DONE, являющемся истинным; snapshot.hasData равно null (включая случаи, когда ожидаемый результат операции имеет тип void)

Ответ на ваш вопрос зависит от того, был ли прикреплен к объект ошибки ответ от сервера или нет, когда запрос является ошибочным из-за чего-то, что произошло на стороне сервера. Всегда будет объект ошибки, присоединенный к ответу, если запрос не выполнен, потому что он никогда не был сделан из-за плохой сети.

Если объект ошибки имеет значение null, то LoadingIndicator будет отображаться неопределенно

...