如何正确定义 Future 列表?
How to define a Future list the right way?
我对 flutter 和 dart 有点陌生,我正在尝试使用 future builder 创建一些从 firebase 获取数据的小部件。实际上对我不起作用的是我的未来功能,因为我基本上没有 return 未来。这是我要使用的功能。这里的 friends 是一个用户列表,用于访问 firebase 上的数据。我的问题在于列表试验的定义,它是 return 空的,没有任何未来。我获取每个成员数据的代码似乎工作得很好至少添加了数据然后小部件自行构建但在此之前我有这个空列表 returned 其中 returns 是真的在 snapshots.hasData 上。如果有人可以帮助我,那就太棒了。事实上,在我看来,我有一份期货清单,但我不太明白如何把它放进去。
`Future<List<dynamic>> _getData(members) async {
List trial = [];
int _daysUntilBirthday;
friends.map((friend) async => await DatabaseService().getUserInfo(
generalServices().destructureId(friend),
['uid']).then((snapshots) {
trial.add({
'uid': snapshots[0],
});
}))
//.toList()
;
return trial;`
我的 futureBuilder 是在 streamBuilder 中创建的:
Widget build(BuildContext context) {
return StreamBuilder(
stream: _members,
builder: (context, snapshot) {
if (snapshot.hasData) {
if (snapshot.data['members'] != null) {
if (snapshot.data['members'].length != 0) {
AsyncSnapshot<dynamic> _userData = snapshot;
return FutureBuilder<List>(
future: _getData(_userData.data['members']),
builder: (context, AsyncSnapshot<List> snapshot) {
if (snapshot.hasData) {
if (snapshot.data != null) {
List sortedList = snapshot.data
..sort((a, b) => a['age']
.compareTo(b['age']));
return ListView.builder(
主要问题是,_getData
(如您所说)不是 returning Future。相反,你在 .map
实现中处理未来。因此,在您的请求完成之前,该函数将 return 一个空数组 trial
。
相反,将每个 getUserInfo
编辑的 Future
return 添加到 Iterable
,然后 return Future
等待所有他们马上。
我试图在不知道上下文的情况下重写函数,因为老实说很难从你的问题中分辨出来:
Future<List<dynamic>> _getData(friends) {
final userInfoFutures = friends.map((friend) => DatabaseService().getUserInfo(
generalServices().destructureId(friend), ['uid']));
}));
return Future.wait(userInfoFutures);
}
旁注:我删除了您的示例中的很多混乱(未使用的变量和参数)。
我对 flutter 和 dart 有点陌生,我正在尝试使用 future builder 创建一些从 firebase 获取数据的小部件。实际上对我不起作用的是我的未来功能,因为我基本上没有 return 未来。这是我要使用的功能。这里的 friends 是一个用户列表,用于访问 firebase 上的数据。我的问题在于列表试验的定义,它是 return 空的,没有任何未来。我获取每个成员数据的代码似乎工作得很好至少添加了数据然后小部件自行构建但在此之前我有这个空列表 returned 其中 returns 是真的在 snapshots.hasData 上。如果有人可以帮助我,那就太棒了。事实上,在我看来,我有一份期货清单,但我不太明白如何把它放进去。
`Future<List<dynamic>> _getData(members) async {
List trial = [];
int _daysUntilBirthday;
friends.map((friend) async => await DatabaseService().getUserInfo(
generalServices().destructureId(friend),
['uid']).then((snapshots) {
trial.add({
'uid': snapshots[0],
});
}))
//.toList()
;
return trial;`
我的 futureBuilder 是在 streamBuilder 中创建的:
Widget build(BuildContext context) {
return StreamBuilder(
stream: _members,
builder: (context, snapshot) {
if (snapshot.hasData) {
if (snapshot.data['members'] != null) {
if (snapshot.data['members'].length != 0) {
AsyncSnapshot<dynamic> _userData = snapshot;
return FutureBuilder<List>(
future: _getData(_userData.data['members']),
builder: (context, AsyncSnapshot<List> snapshot) {
if (snapshot.hasData) {
if (snapshot.data != null) {
List sortedList = snapshot.data
..sort((a, b) => a['age']
.compareTo(b['age']));
return ListView.builder(
主要问题是,_getData
(如您所说)不是 returning Future。相反,你在 .map
实现中处理未来。因此,在您的请求完成之前,该函数将 return 一个空数组 trial
。
相反,将每个 getUserInfo
编辑的 Future
return 添加到 Iterable
,然后 return Future
等待所有他们马上。
我试图在不知道上下文的情况下重写函数,因为老实说很难从你的问题中分辨出来:
Future<List<dynamic>> _getData(friends) {
final userInfoFutures = friends.map((friend) => DatabaseService().getUserInfo(
generalServices().destructureId(friend), ['uid']));
}));
return Future.wait(userInfoFutures);
}
旁注:我删除了您的示例中的很多混乱(未使用的变量和参数)。