Flutter:FutureBuilder 内部的异步调用
Flutter: Async call inside FutureBuilder
我有一个异步调用,它为我提供了一个 objects
的列表,我从中生成了一个带有 ListView.builder
的 ListView。每个对象都有一个名为 usedId
的 属性,它是一个整数。
我正在尝试根据其 id
获取 user object
。
这是我的 FutureBuilder:
FutureBuilder<MyObjects>(
future: getMyObjects(),
builder: (context, snapshot) {
if (snapshot.hasError) return Text('Error ${snapshot.error}');
if (snapshot.connectionState != ConnectionState.done) return Center(child: CircularProgressIndicator());
return ListView.builder(
itemCount: snapshot.data.content.length,
itemBuilder: (BuildContext context, int index) {
// Get user by its id
User user;
Future<User> futureUser = QuestionRestApi.getStatistics(snapshot.data.userId);
futureUser.then((data) {
print(user);
user = data;
});
return Text('Username: user.username');
}
)
}
);
我的用户是在 then() 函数中打印的,但是因为它必须等待它。我只是不知道如何在异步调用中处理异步调用。
您需要多个 FutureBuilder:
FutureBuilder<MyObjects>(
future: getMyObjects(),
builder: (context, snapshot) {
if (snapshot.hasError) return Text('Error ${snapshot.error}');
if (snapshot.connectionState != ConnectionState.done) return Center(child: CircularProgressIndicator());
return ListView.builder(
itemCount: snapshot.data.content.length,
itemBuilder: (BuildContext context, int index) {
return FutureBuilder<User>(
future: QuestionRestApi.getStatistics(snapshot.data.userId),
builder: (context, userSnapshot) {
return Text('Username: ${userSnapshot.data.username}');
}
}
)
}
);
这将为每个列表项调用 QuestionRestApi.getStatistics
(因此有多个请求)
但如果您只需要检索此用户一次:
我有一个异步调用,它为我提供了一个 objects
的列表,我从中生成了一个带有 ListView.builder
的 ListView。每个对象都有一个名为 usedId
的 属性,它是一个整数。
我正在尝试根据其 id
获取 user object
。
这是我的 FutureBuilder:
FutureBuilder<MyObjects>(
future: getMyObjects(),
builder: (context, snapshot) {
if (snapshot.hasError) return Text('Error ${snapshot.error}');
if (snapshot.connectionState != ConnectionState.done) return Center(child: CircularProgressIndicator());
return ListView.builder(
itemCount: snapshot.data.content.length,
itemBuilder: (BuildContext context, int index) {
// Get user by its id
User user;
Future<User> futureUser = QuestionRestApi.getStatistics(snapshot.data.userId);
futureUser.then((data) {
print(user);
user = data;
});
return Text('Username: user.username');
}
)
}
);
我的用户是在 then() 函数中打印的,但是因为它必须等待它。我只是不知道如何在异步调用中处理异步调用。
您需要多个 FutureBuilder:
FutureBuilder<MyObjects>(
future: getMyObjects(),
builder: (context, snapshot) {
if (snapshot.hasError) return Text('Error ${snapshot.error}');
if (snapshot.connectionState != ConnectionState.done) return Center(child: CircularProgressIndicator());
return ListView.builder(
itemCount: snapshot.data.content.length,
itemBuilder: (BuildContext context, int index) {
return FutureBuilder<User>(
future: QuestionRestApi.getStatistics(snapshot.data.userId),
builder: (context, userSnapshot) {
return Text('Username: ${userSnapshot.data.username}');
}
}
)
}
);
这将为每个列表项调用 QuestionRestApi.getStatistics
(因此有多个请求)
但如果您只需要检索此用户一次: