如何嵌套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
}
}
);
}
首先我需要获取一些 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
}
}
);
}