Flutter 如何以正确的方式定义未来列表?

Flutter 如何以正确的方式定义未来列表?,flutter,dart,future,Flutter,Dart,Future,我对flatter和dart有点陌生,我正在尝试使用FutureBuilder来创建一些从firebase获取数据的小部件。实际上对我不起作用的是我的future函数,因为我基本上不返回future。这是我想要使用的函数。这里的friends是访问firebase数据的用户列表。我的问题在于列表试验的定义,它返回为空,没有任何未来。我获取每个成员数据的代码似乎工作得很好,至少添加了数据,然后小部件自行构建,但在此之前,我返回了这个空列表,它在snapshots.hasData上返回一个true。

我对flatter和dart有点陌生,我正在尝试使用FutureBuilder来创建一些从firebase获取数据的小部件。实际上对我不起作用的是我的future函数,因为我基本上不返回future。这是我想要使用的函数。这里的friends是访问firebase数据的用户列表。我的问题在于列表试验的定义,它返回为空,没有任何未来。我获取每个成员数据的代码似乎工作得很好,至少添加了数据,然后小部件自行构建,但在此之前,我返回了这个空列表,它在snapshots.hasData上返回一个true。如果有人能帮我,那就太棒了。事实上,在我看来,我有一个未来的清单,但我不太明白如何把它纳入其中

    `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;`
`Future\u getData(成员)异步{
列表试验=[];
国际日至生日;
map((friend)async=>await DatabaseService().getUserInfo(
generalServices().destructureId(friend),
['uid'])。然后((快照){
试用版({
“uid”:快照[0],
});
}))
//托利斯先生()
;
返回审判`
My 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(
小部件构建(构建上下文){
返回流生成器(
资料流:_成员,
生成器:(上下文,快照){
if(snapshot.hasData){
if(snapshot.data['members']!=null){
if(snapshot.data['members'].length!=0){
AsyncSnapshot\u userData=快照;
回归未来建设者(
未来:_getData(_userData.data['members']),
生成器:(上下文,异步快照){
if(snapshot.hasData){
如果(snapshot.data!=null){
List sortedList=snapshot.data
…排序((a,b)=>a['age']
.与(b[‘年龄’))相比;
返回ListView.builder(

主要问题是,
\u getData
没有返回未来(如您所说)。相反,您在
.map
实现中处理未来。因此,该函数将在您的请求完成之前返回空数组
试用版

相反,将每个
getUserInfo
返回的
Future
添加到
Iterable
中,然后返回
Future
,同时等待它们

我试图在不了解上下文的情况下重写函数,因为从您的问题很难判断:

Future\u获取数据(朋友){
final userInfoFutures=friends.map((friend)=>DatabaseService().getUserInfo(
generalServices().destructureId(friend),['uid']);
}));
返回Future.wait(userInfoFutures);
}

旁注:您的示例(未使用的变量和参数)中有很多杂乱无章的地方,我将其删除。

步骤1:将代码组织成函数,这样获取数据的代码就不会使UI代码过于复杂。正如@sventropy所说,其中一个问题是_getData函数。看起来您是从使用承诺中来的(基本上是未来),但在Dart中,您有词法作用域,并且async await在其自身的闭包中,因此_getData函数在返回空数组之前不会等待内部then()更新以更新试用版。然后在构建函数运行且UI缺少更新后,它在单独的作用域中更新试用版。“await”在Dart中进一步执行之前,需要在相同的函数作用域中暂停函数调用。