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 流