StreamBuilder 仅在热重启后更新流

Posted

技术标签:

【中文标题】StreamBuilder 仅在热重启后更新流【英文标题】:StreamBuilder updating the stream only after hot restart 【发布时间】:2021-10-27 09:42:43 【问题描述】:

我正在构建一个应用程序,它会收集从 Firebase 下达的所有订单和订单详细信息。我必须得到两件事

用户登录后我使用单例方法保存的联系人号码中的沙龙详细信息 来自 CustID 的客户详细信息

现在发生的情况是,在调试过程中我创建了这个按钮,按下它会从数据库中获取沙龙详细信息。但是现在,只有在我获取详细信息时才能获取

    先点击按钮 热重启应用

只有这样流构建器才能获取数据 这是我的代码 sn-ps 导致问题:

Future<void> getSalonFromContact(String saloonContact) async 
    await for (var docs in firestore.collection('Saloon').snapshots()) 
      //  final loop = snap.data!.docs;
      for (var variable in docs.docs) 
        if (variable.get(FieldPath(['Contact'])) == saloonContact) 
          aadhar = variable.get(FieldPath(['Aadhar']));

          getOrdersList(aadhar);
        
      
    
  

  Future<void> getOrdersList(String aadhar) async 
    ordersList.clear();
    await for (var docs in firestore
        .collection('orders')
        .where('SalonID', isEqualTo: aadhar)
        .snapshots()) 
      for (var variable in docs.docs) 
        if (variable.get('SalonID') == aadhar) 
          ordersList.add(variable.data());

          print('My orderlist is $ordersList');
         else 
          continue;
        
      
    
  

  Future<void> getCustomerDetails(String custID) async 
    await for (var docs in firestore
        .collection('Customers')
        .where('Customer_Uid', isEqualTo: custID)
        .snapshots()) 
      //  final loop = snap.data!.docs;
      for (var variable in docs.docs) 
        print(variable.data());
        if (variable.get(FieldPath(['Customer_Uid'])) == custID) 
          customerDetails.add(variable.data());
          print('My customer details are $customerDetails');
        
      
    
  

  @override
  void didChangeDependencies() async 
    await getSalonFromContact(contactNumber);
    for (int i = 0; i < ordersList.length; i++) 
      await getCustomerDetails(ordersList[i]['CustomerID']);
    
    // TODO: implement didChangeDependencies
    super.didChangeDependencies();
  

这些代码用于查找详细信息。

这是我的 StreamBuilder 代码:

 StreamBuilder<QuerySnapshot>(
                      stream: FirebaseFirestore.instance
                          .collection('orders')
                          .where('SalonID', isEqualTo: aadhar)
                          .snapshots(),
                      builder: (context, snapshot) 
                        didChangeDependencies();
                        if (snapshot.connectionState ==
                            ConnectionState.waiting) 
                          return Text('Loading...');
                         else 
                          List<AppointmentCard> listitems = [];

                          return ListView(
                            physics: NeverScrollableScrollPhysics(),
                            shrinkWrap: true,
                            children: snapshot.data!.docs
                                .asMap()
                                .map((index, DocumentSnapshot document) 
                                  getCustomerDetails(document['CustomerID']);
                                  return MapEntry(
                                    index,
                                    AppointmentCard(
                                      isCompleted: document['Status'],
                                      name: customerDetails[index]['Name'],
                                      contact: customerDetails[index]
                                          ['Contact'],
                                      services: Flexible(
                                        child: ListView.builder(
                                            shrinkWrap: true,
                                            padding: const EdgeInsets.all(8),
                                            itemCount:
                                                document['Requested_Service']
                                                    .length,
                                            itemBuilder: (BuildContext context,
                                                int index) 
                                              return Text(
                                                  document['Requested_Service']
                                                      [index]['name']);
                                            ),
//                                child: Text(
//                                  //    "Text",
//                                  " $ordersList[i]['Requested_Service'] ",
////                                      .join(' '),
//
//                                  softWrap: true,
//                                ),
                                      ),
                                    ),
                                  );
                                )
                                .values
                                .toList(),
                          );
                        
                      ),

知道出了什么问题以及如何在没有按钮和热重启的情况下获取数据?

【问题讨论】:

把这个ordersList.add(variable.data());放到setState @Pokaboom 它没有帮助 【参考方案1】:

您在 MapEntry 之前使用getCustomerDetails(document['CustomerID']);,它是一个异步函数。它可能会在 MapEntry 构建后返回。在将正在更新的变量放入 getCustomerDetails 函数之前,您必须等待 getCustomerDetails 函数。

【讨论】:

是的,我明白这就是问题所在。但是我该如何解决呢? 你能把await放在getCustomerDetails之前吗?如果不能,您可以在构建 ListView 之前完成所有逻辑。

以上是关于StreamBuilder 仅在热重启后更新流的主要内容,如果未能解决你的问题,请参考以下文章

仅在热重新加载后才加载我的值

Flutter:如何为 StreamBuilder 制作 http 流

Flutter:应用程序在热重载后不断回到初始路线

StreamBuilder snapshot.hasError 在键盘显示/隐藏颤动时显示多次

Android相机应用程序(图片仅在重启后显示)

Flutter:Streambuilder - 关闭流