firebase - Flutter - StreamProvider - 向 Firebase 发送重复出现的 XHR 请求
问题描述
我注意到我的读取请求显着增加,因为我使用StreamProvider添加了一个新流,我设法通过删除流并且没有重复请求来确认这一点。但我似乎无法追查为什么它会重复。
注意:代码功能正常,只是这些读取请求已经过时了。
溪流
//get list of all open enquiries
Stream<List<EnquiryData>> get centreDashboardOpenEnquiries {
return centresCollection.document(centreID).collection('enquiries').where('enquiryStatus', whereIn: ['New', 'Contacted', 'Tour Scheduled', 'Tour Completed']).snapshots().map(_enquiryList);
}
//Map QuerySnapshot to List of EnquiryData
List<EnquiryData> _enquiryList(QuerySnapshot enquiry){
return enquiry.documents.map((doc) {
return EnquiryData(
enquiryID: doc.data['enquiryID'].toString(),
parentFirstName: doc.data['firstName'],
parentLastName: doc.data['lastName'],
parentPhoneNumber: doc.data['phoneNumber'],
parentEmail: doc.data['email'],
parentAddress: doc.data['address'],
methodOfEnquiry: doc.data['methodOfEnquiry'],
hearAboutUs: doc.data['hearAboutUs'],
specificHearAboutUs: doc.data['specificHearAboutUs'],
impressionOfCentre: doc.data['firstImpression'],
enquiryStatus: doc.data['enquiryStatus'],
created: doc.data['created'],
lastUpdated: doc.data['lastUpdated'],
);
}).toList();
}
使用 CurrentOpenDataTable 子调用 Stream
child: StreamProvider<List<EnquiryData>>.value(
value: EnquiryDatabaseService(centreID: widget.centreData.centreID).centreDashboardOpenEnquiries,
child: CurrentOpenDataTable(),
),
当前打开数据表()
class CurrentOpenDataTable extends StatefulWidget {
@override
_CurrentOpenDataTableState createState() => _CurrentOpenDataTableState();
}
class _CurrentOpenDataTableState extends State<CurrentOpenDataTable> {
@override
Widget build(BuildContext context) {
final enquiryData = Provider.of<List<EnquiryData>>(context) ?? [];
return DataTable(
showCheckboxColumn: false,
sortColumnIndex: 1,
sortAscending: true,
columns: [
DataColumn(
label: Text('Date'),
),
DataColumn(
label: Text('Name'),
//numeric: true,
),
DataColumn(
label: Text('Status'),
),
],
rows: _enquiryRow(context, enquiryData),
);
}
}
_dateFormat(DateTime dateTime) {
String formattedDate = DateFormat('dd/MM/yyyy').format(dateTime);
return formattedDate;
}
_enquiryRow(BuildContext context, List<EnquiryData> enquiryData) {
List<DataRow> listOfDataRows = List.generate(
enquiryData.length,
(index) => DataRow(
cells: [
DataCell(Text(_dateFormat(DateTime.fromMillisecondsSinceEpoch(
enquiryData[index].created)))),
DataCell(Text(enquiryData[index].parentFirstName +
' ' +
enquiryData[index].parentLastName)),
DataCell(Text(enquiryData[index].enquiryStatus)),
],
onSelectChanged: (bool selected) {
if (selected) {
showEnquiryDialog(context, enquiryData[index]);
}
}));
return listOfDataRows;
}
解决方案
包含的小部件(我们称之为MyWidget
)StreamProvider
正在不断地重建。
您不应该创建EnquiryDatabaseService
inside StreamProvider<List<EnquiryData>>.value
,而是获取内部流initState
。
例子
class _MyWidgetState extends State<MyWidget> {
Stream<List<EnquiryData>> _stream;
@override
initState() {
_stream = EnquiryDatabaseService(centreID: widget.centreData.centreID). centreDashboardOpenEnquiries;
}
// ... in build
StreamProvider.value(
value: _stream,
child: Container(/* ... */),
),
}
或者不要使用.value
构造函数。
StreamProvider(
create: (_) => EnquiryDatabaseService(centreID: widget.centreData.centreID). centreDashboardOpenEnquiries,
child: Container(/* ... */),
),
在此处阅读有关该做什么和不该做什么的更多信息 此处提供 更多参考 -如何处理不需要的小部件构建?
推荐阅读
- c++ - 为什么每次打开 Visual Studio Code 时都会运行这么多 cc1.exe 任务?
- keycloak - Keycloak onLoad:'check-sso' return error=login_required in url
- jenkins - Jenkins Groovy - 检查作业是否正在等待可锁定资源
- python - Vscode:如何在 Python 控制台而不是终端中运行代码
- google-contacts-api - 提高 Google My Business API 的配额限制
- mysql - MySQL IF (if else) ELSEIF (if else) 语句如何在存储过程中使用?(mysql 版本 6.0.11-alpha-community)
- javascript - 如何在课堂上正确添加内联监听器?
- java - SpannableStringBuilder 仅保留第一个 for 循环的格式
- python - 由对照组均值归一化的 pandas seaborn pointplot
- php - 在 WooCommerce 电子邮件上显示价格后缀