Чтобы мой 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
. Должен ли я делать это?
просто используйте один FutureBuilder
- вам не нужны эти два вложенных FutureBuilder
- вместо этого вы должны использовать Future
, который завершается на основе ваших двух других Future
Я не понял тебя. Не могли бы вы объяснить больше? (Если возможно, с помощью кода.)
см., в частности, dartlang.org/tutorials/language/futures и dartlang.org/tutorials/language/futures#calling-multiple-funcs
Даже я рассматривал возможность использования Future.wait
, но тогда _future2
всегда будет выполняться после _future1
. Как я могу проверить состояние и принять соответствующее решение?
вам не нужно Future.wait
вам нужно expensiveA() .then((aValue) => expensiveB()) .then((bValue) => expensiveC()) .then((cValue) => doSomethingWith(cValue));
или что-то в этом роде, больше здесь или здесь
Да, я также пробую другие подобные программы. Между тем - пожалуйста, добавьте все это в ответ, чтобы я мог это отметить. :) Интересно, почему вы продолжаете комментировать, а не отвечать.
Вы также можете написать ответ на свой вопрос :-)
В 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;
},
);}
вы все еще используете два FutureBuilder
s... - один в checkCode()
, а другой в build()
методе
Только если я получу 200 в первом. Мне нужно загрузить информацию и показать индикатор выполнения, пока информация не будет загружена... Это неправильно?
используйте один метод FutureBuilder
внутри build()
, который либо строит CircularProgressIndicator
, либо YourFinalWidget
, когда ваш Future
завершается
FutureBuilder
- я имею в виду: if (snapshot.hasError) { ...
можно поподробнее. вы используете
AsyncMemoizer
, как описано в ссылке? введение некоторого кода поможет.