如何嵌套Futures在initState中互相等待

How to nest Futures to wait for each other in initState

首先我需要获取一些 id => 其中一个返回的 id 又名:userId 用于获取 mailboxId => mailboxId 用于获取列表消息模型。
PS:每个调用都是独立的,因为这是 API 的构建方式

@override
void initState() {
  super.initState();
  futureIds = fetchIds();
  // start those two after fetchIds() finishes
  futureMailboxId = fetchMailboxId(userId);
  futureLanguage = fetchLanguage(userId);
  // start this after fetchMailboxId(userId) finishes
  futureMessages = fetchMessages(mailboxId);
}

你不能直接在 init statse 中等待,但你可以使用 didChangeDependencies() 功能,你可以在那里等待,所以我在下面提到

@override
 Future  <void> didChangeDependencies() async{

  futureIds = await fetchIds();
    // TODO: implement didChangeDependencies
    super.didChangeDependencies();
  }

futureDetails: 是 StatefulWidget
的 Future属性 Globals:包含整个应用程序使用的静态属性
Message: 是一个带有工厂方法的模型fromJson

@override
void initState() {
  super.initState();
  futureDetails = fetchIds().then((List<int> ids) => {
      Globals.userId = ids[0];
      Future.wait([
        fetchLanguage(Globals.userId),
        fetchMailboxId(Globals.userId)
      ]).then((List<dynamic> futureResult) => {
        Globals.mailboxId = futureResult[1];
        fetchMessages(Globals.mailboxId).then((Map<String, dynamic> messagesAsJson) => {
          messagesAsJson.forEach((msgJson) => Globals.messages.add(Message.fromJson(msgJson)));
        });
      });
  });
}

@override
  Widget build(BuildContext context) {
    return FutureBuilder<Widget>(
        future: futureDetails,
        builder: (BuildContext context, AsyncSnapshot<List<int>> snapshot) {
          if (snapshot.hasData) {
            // display data empty/filled
          } else if (snapshot.hasError) {
            // display error
          } else {
            // display loader
          }
        }
    );
  }