Я использую метод initState()
виджета flutter для создания двух будущих целых чисел; delayed
, который является простым Future.delay
, и delayedAwaited
, который ожидает переменной delayed
и удваивает ее значение. Метод build()
включает два FutureBuilder
, по одному на каждое будущее. См. Пример кода ниже:
class FutureTest extends StatefulWidget {
@override
_FutureTestState createState() => _FutureTestState();
}
class _FutureTestState extends State<FutureTest> {
Future<int>? delayed;
Future<int>? delayedAwaited;
@override
void initState() {
super.initState();
initFutures();
}
void initFutures() async {
delayed = Future.delayed(Duration(seconds: 2), () => 5);
delayedAwaited = Future.value((await delayed)! * 2);
}
@override
Widget build(BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
FutureBuilder(
future: delayed,
builder: (context, snapshot) => Text('delayed: ${snapshot.data}'),
),
FutureBuilder(
future: delayedAwaited,
builder: (context, snapshot) => Text('awaited: ${snapshot.data}'),
),
],
);
}
}
Вот проблема: пользовательский интерфейс обновляется только для delayed
, а не для delayedAwaited
(он остается нулевым). Пользовательский интерфейс обновляется, чтобы отражать истинное значение при ручной перезагрузке, поэтому будущее решается правильно, но Flutter просто не запускает FutureBuilder
для восстановления. Я ожидал, что пользовательский интерфейс обновится и для delayAwaited
.
Смотрите поведение здесь: https://dartpad.dev/62b272db200ca39ed854be5a7183967d?null_safety=truet=ru
По какой-то причине изменение initFutures()
на использование Future.delayed
для обоих фьючерсов устраняет проблему, как показано здесь: https://dartpad.dev/9b386a45428046b193800351a4ade5b1?null_safety=true
Может ли кто-нибудь объяснить, почему данный код работает так, и что лучше всего подходит для достижения того, что я пытаюсь сделать.
print(delayed); print(delayedAwaited);
в первую строкуbuild()
метода объяснит, почему это происходит - person pskink   schedule 16.01.2021