等待一个函数在 ListView 中完成

Posted

技术标签:

【中文标题】等待一个函数在 ListView 中完成【英文标题】:Wait a function to be done in ListView 【发布时间】:2021-07-03 02:08:41 【问题描述】:

由于 Firestore 请求,我需要等待我的函数在 ListView 中完成。我尝试使用 Future.wait() 但它不起作用。

FutureBuilder<QuerySnapshot>(
                    future: FirebaseFirestore.instance
                        .collection('Statements')
                        .where('userID',isEqualTo: context.watch<User>().uid)
                        .get(),
                    builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot)
                      if (snapshot.hasError) return Text("Erreur");
                      if (snapshot.connectionState == ConnectionState.waiting) 
                        return Text("Loading");
                      return Expanded(
                        child:ListView.builder(
                          itemCount: snapshot.data.docs.length,
                            itemBuilder: (context, index) 
                              DocumentSnapshot document = snapshot.data.docs[index];
                              Future.wait([getStatementData(document)]);
                              return StatementCard(statement:selectedStatement,
                                           accommodation : relatedAccommodation,
                                           owner : relatedOwner);
                            ,
                        )

这是调用的函数:

Future getStatementData(document)  async 

    selectedStatement = Statement.fromFirebase(document);

    document.data()["accommodation"].get().then((value) 
      relatedAccommodation = Accommodation.fromFirebase(value););

     await FirebaseFirestore.instance
         .collection('Owners')
         .doc(document["ownerList"][0])
         .get().then((value) 
           print(value.data());
           relatedOwner = Owner.fromFirebase(value);
     );

  

我应该使用另一个未来的构建器吗?

【问题讨论】:

【参考方案1】:

你应该这样做,在里面返回另一个 Future Builder:

   ListView.builder(
          itemCount: snapshot.data.docs.length,
          itemBuilder: (context, index) 
         DocumentSnapshot document = snapshot.data.docs[index];
        return  FutureBuilder(
      future: getStatementData(document) ,
      builder: (context, snapshot) 
        return snapshot.connectionState == ConnectionState.done
               ? StatementCard(statement:selectedStatement,
                accommodation : relatedAccommodation,
                 owner : relatedOwner);
               : Container(); 
    );
      ,
         )

【讨论】:

【参考方案2】:

我认为您只是错过了一个简单的事情,FutureBuilder 也有一个您可以访问的 connectionstate.done 状态。这会等到您未来的功能完成。

return FutureBuilder(
            future: yourFunction,
            builder: (context, snapshot) 
              switch (snapshot.connectionState) 
                case ConnectionState.none:
                  return Center(child: Text('No status',);
                  break;
                case ConnectionState.waiting:
                  return Center(child: CircularProgressIndicator());
                  break;
                case ConnectionState.done:
                return Text('Im done!') // Your listviewbuilder comes here
                  break;
                default:
              
            , 
          ),

文档:https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html 带有 ListViewBuilder 的 FutureBuilder 示例:https://medium.com/nonstopio/flutter-future-builder-with-list-view-builder-d7212314e8c9

[...]connectionState.done = [future] 不为空,并且已完成。如果未来成功完成,[AsyncSnapshot.data] 将设置为未来完成的值。如果它以错误完成,[AsyncSnapshot.hasError] 将为真,[AsyncSnapshot.error] 将设置为错误对象。[...]

【讨论】:

以上是关于等待一个函数在 ListView 中完成的主要内容,如果未能解决你的问题,请参考以下文章

Android的RecyclerView

如何在同一个 Activity onCreate() 中执行 WebView 和 ListView?

UWP ListView下模板宽度问题

从 firebase 读取数据,并在 listview 中填充

为啥不可见的虚拟 ListView 的项目没有索引?

在 Android 中的顶部 ListView 项目上方(以及最后一个项目下方)添加边距