使用等待链接 Futures 时,Flutter FutureBuilder 小部件不响应 Future 解析
Flutter FutureBuilder widget not responding to Future resolution when chaining Futures with await
我正在使用 flutter 小部件的 initState()
方法来创建两个未来的整数; delayed
是一个简单的 Future.delay
,而 delayedAwaited
等待 delayed
变量并将其值加倍。 build()
方法包括两个 FutureBuilder
,每个 future 一个。请参阅下面的示例代码:
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}'),
),
],
);
}
}
这是问题所在:UI 仅更新 delayed
而不是 delayedAwaited
(它仍然为空)。 UI 被更新以反映手动热重载时的真实值,因此未来正在正确解析,但 Flutter 只是没有触发 FutureBuilder
重建。我的期望是 UI 也会更新 delayAwaited
。
查看此处的行为:https://dartpad.dev/62b272db200ca39ed854be5a7183967d?null_safety=true
出于某种原因,更改 initFutures()
以便它对两个期货使用 Future.delayed
解决了这个问题,如下所示:https://dartpad.dev/9b386a45428046b193800351a4ade5b1?null_safety=true
有谁能解释为什么给定的代码是这样工作的,以及实现我正在尝试做的事情的最佳实践是什么。
你可以这样做,因为你在评论中提到你只想使用 async/await:
void initFutures() {
delayed = fordelayed();
delayedAwaited = fordelayedAwaited();
}
Future<int> fordelayed() async {
return await Future.delayed(Duration(seconds: 2), () => 5);
}
Future<int> fordelayedAwaited() async {
int fromdelayed = await fordelayed();
return fromdelayed * 2;
}
我正在使用 flutter 小部件的 initState()
方法来创建两个未来的整数; delayed
是一个简单的 Future.delay
,而 delayedAwaited
等待 delayed
变量并将其值加倍。 build()
方法包括两个 FutureBuilder
,每个 future 一个。请参阅下面的示例代码:
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}'),
),
],
);
}
}
这是问题所在:UI 仅更新 delayed
而不是 delayedAwaited
(它仍然为空)。 UI 被更新以反映手动热重载时的真实值,因此未来正在正确解析,但 Flutter 只是没有触发 FutureBuilder
重建。我的期望是 UI 也会更新 delayAwaited
。
查看此处的行为:https://dartpad.dev/62b272db200ca39ed854be5a7183967d?null_safety=true
出于某种原因,更改 initFutures()
以便它对两个期货使用 Future.delayed
解决了这个问题,如下所示:https://dartpad.dev/9b386a45428046b193800351a4ade5b1?null_safety=true
有谁能解释为什么给定的代码是这样工作的,以及实现我正在尝试做的事情的最佳实践是什么。
你可以这样做,因为你在评论中提到你只想使用 async/await:
void initFutures() {
delayed = fordelayed();
delayedAwaited = fordelayedAwaited();
}
Future<int> fordelayed() async {
return await Future.delayed(Duration(seconds: 2), () => 5);
}
Future<int> fordelayedAwaited() async {
int fromdelayed = await fordelayed();
return fromdelayed * 2;
}