firebase - Flutter - StreamProvider - 将重复发生的 XHR 请求发送到 Firebase

标签 firebase flutter google-cloud-firestore flutter-web

我注意到自从我使用 StreamProvider 添加新流以来,我的读取请求显着增加。 ,我设法通过删除流并且没有重复请求来确认这一点。但我似乎无法找出为什么它会重复。

注意:代码运行良好,只是这些读取请求已经超出了上限。

enter image description here

直播

//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 子项的调用流

child: StreamProvider<List<EnquiryData>>.value(
    value: EnquiryDatabaseService(centreID: widget.centreData.centreID).centreDashboardOpenEnquiries,
    child: CurrentOpenDataTable(),
),

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;
}

enter image description here

最佳答案

包含 MyWidget 的小部件(我们称之为 StreamProvider )正在不断重建。

您不应该创建 EnquiryDatabaseService里面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(/* ... */),
),

了解有关 do's and don'ts here 的更多信息 更多引用这里 - How to deal with unwanted widget build?

关于firebase - Flutter - StreamProvider - 将重复发生的 XHR 请求发送到 Firebase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61690308/

相关文章:

flutter run 给出 Gradle 任务 assembleDebug 失败,退出代码 1

flutter - 如何修复 Flutter 中的“"the getter ' length' was called on null”错误

java - 连接丢失后 Firebase Firestore 需要很长时间才能重新连接

Flutter)如何计算 map 内的特定值

javascript - 为什么 Firestore 返回集合引用,但我的程序将其视为数组?

node.js - 如何从 Firebase Cloud Function 访问 firestore.Timestamp

firebase - 基于 Firebase 中的多个 where 子句的查询

swift - 从 Firebase 获取特定的 .childrenCount

ios - 在 childByAutoId Firebase Swift 中访问特定数据

java - Firebase Firestore异步行为问题