使用等待链接 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;
  }