Как использовать вложенные FutureBuilders и убедиться, что одно будущее вызывается за другим?

Чтобы мой FutureBuilder не вызывался снова и снова (см. это), у меня есть привычка вызывать свои фьючерсы в initState, и это всегда работало нормально, пока мне не пришлось использовать вложенные.

По сути, я хочу, чтобы второе будущее вызывалось только после того, как connectionState из 1-го станет done. Любая помощь?

Вот мой код для дальнейшего объяснения:

FutureBuilder(
  future: _future1,
  builder: (BuildContext context, AsyncSnapshot snapshot) {
    return snapshot.connectionState != ConnectionState.done
        ? CircularProgressIndicator()
        : snapshot.data != 200
            ? SomeWidget()
            : FutureBuilder(
                future: _future2,
                builder: (BuildContext context, AsyncSnapshot snapshot) {
                  return snapshot?.connectionState == ConnectionState.done
                      ? Text('')
                      : CircularProgressIndicator();
                });
  },
);

Таким образом, я вообще не хочу, чтобы _future2 вызывался, если данные, полученные от _future1, не равны 200. Другими словами, я хочу решить, следует ли вызывать _future2 на основе результата _future1.

можно поподробнее. вы используете AsyncMemoizer, как описано в ссылке? введение некоторого кода поможет.

Harsh Bhikadia 10.04.2019 16:15

Я добавил код, чтобы объяснить больше, и нет, я не использую AsyncMemoizer. Должен ли я делать это?

Keerti Purswani 11.04.2019 07:45

просто используйте один FutureBuilder - вам не нужны эти два вложенных FutureBuilder - вместо этого вы должны использовать Future, который завершается на основе ваших двух других Future

pskink 11.04.2019 07:53

Я не понял тебя. Не могли бы вы объяснить больше? (Если возможно, с помощью кода.)

Keerti Purswani 11.04.2019 07:56

Даже я рассматривал возможность использования Future.wait, но тогда _future2 всегда будет выполняться после _future1. Как я могу проверить состояние и принять соответствующее решение?

Keerti Purswani 11.04.2019 08:30

вам не нужно Future.wait вам нужно expensiveA() .then((aValue) => expensiveB()) .then((bValue) => expensiveC()) .then((cValue) => doSomethingWith(cValue)); или что-то в этом роде, больше здесь или здесь

pskink 11.04.2019 08:32

Да, я также пробую другие подобные программы. Между тем - пожалуйста, добавьте все это в ответ, чтобы я мог это отметить. :) Интересно, почему вы продолжаете комментировать, а не отвечать.

Keerti Purswani 11.04.2019 09:17

Вы также можете написать ответ на свой вопрос :-)

pskink 11.04.2019 09:32
Асинхронная передача данных с помощью sendBeacon в JavaScript
Асинхронная передача данных с помощью sendBeacon в JavaScript
В современных веб-приложениях отправка данных из JavaScript на стороне клиента на сервер является распространенной задачей. Одним из популярных...
5
9
3 050
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В initState я делаю это -

_future1 = func.then(checkCode);

И затем я написал еще одну функцию, чтобы определить мой виджет в зависимости от кода, который я получаю -

checkCode(int statusCode) {
if (statusCode == 200) {
  _future2Func();
  widgetToNavigate = Text('');
} else {
  widgetToNavigate = SomeWidget();
}}

Итак, наконец, мой код сборки выглядит так:

Widget build(BuildContext context) {
return FutureBuilder(
  future: _future1,
  builder: (BuildContext context, AsyncSnapshot snapshot) {
    return snapshot.connectionState != ConnectionState.done
        ? CircularProgressIndicator()
        : widgetToNavigate;
  },
);}

вы все еще используете два FutureBuilders... - один в checkCode(), а другой в build() методе

pskink 11.04.2019 09:51

Только если я получу 200 в первом. Мне нужно загрузить информацию и показать индикатор выполнения, пока информация не будет загружена... Это неправильно?

Keerti Purswani 11.04.2019 09:52

используйте один метод FutureBuilder внутри build(), который либо строит CircularProgressIndicator, либо YourFinalWidget, когда ваш Future завершается

pskink 11.04.2019 09:55
здесь вы можете прочитать, как бороться с ошибками с FutureBuilder - я имею в виду: if (snapshot.hasError) { ...
pskink 11.04.2019 21:25

Другие вопросы по теме