【问题标题】:Firestore futures火场期货
【发布时间】:2021-09-17 04:26:51
【问题描述】:

这是我学习 Flutter 和 Firebase 的下一步。 (我已将所有代码迁移到 Dart 2)。我正在使用以下代码从 Firestore 集合中获取数据:

List<Event> _getEventsForDay(DateTime day) {
    // kEvents is a linkedHashMap
    for (int i = 0; i < eventDoc.length; i++ ) {
      DateTime eventDate = eventDoc[i].eventDate;
      DateTime eventDateUTC = eventDate.toUtc();
      if (day.year == eventDate.year && day.day == eventDate.day && day.month == eventDate.month) {
        List<Event> eventList = [];
        eventList.add(eventDoc[i].agencyId);
        eventList.add(eventDoc[i].agentId);
        eventList.add(eventDoc[i].eventDate);
        eventList.add(eventDoc[i].eventDescription);
        eventList.add(eventDoc[i].eventDuration);
        eventList.add(eventDoc[i].eventName);
        eventList.add(eventDoc[i].eventStartTime);
        //print('kEvents: $kEvents');
        return (kEvents.putIfAbsent(eventDateUTC, () => eventList))??[];

      }
    }
    return [];
  }

我在 eventDoc 上收到如下运行时错误:

The following NoSuchMethodError was thrown building _BodyBuilder:
The getter 'length' was called on null.
Receiver: null
Tried calling: length

我已经这样声明 eventDoc:

var eventDoc;

eventDoc 填充在此代码中:

StreamBuilder(
            stream: _db.collection('agency').doc(globals.agencyId).collection('event')
              .where('eventDate', isGreaterThanOrEqualTo: kFirstDay)
              .where('eventDate', isLessThanOrEqualTo: kLastDay)
                    .snapshots().map((snapshot) => snapshot.docs
              .map((document) => Event.fromFirestore(document.data()))
              .toList()),
            builder: (context, AsyncSnapshot <List<Event>> eventsSnapShot) {
              if (eventsSnapShot.hasData) {
                eventDoc = eventsSnapShot.data; <<<<< eventDoc populated
                return _buildTableCalendar();
              } else {
                return CircularProgressIndicator();
              }
            },
          ),

我在 eventLoader: 属性中调用 _getEventsForDay():

Widget _buildTableCalendar() {
return TableCalendar(
      firstDay: kFirstDay,
      lastDay: kLastDay,
      focusedDay: _focusedDay,
      selectedDayPredicate: (day) => isSameDay(_selectedDay, day),
      locale: 'en_US',
      eventLoader: (day) {
        return _getEventsForDay(day);
      },

我确定我错误地声明了 eventDoc,但我不知道应该如何声明它。请帮忙。

【问题讨论】:

  • 你在哪里打电话_getEventsForDay()
  • 我在调用 _getEventsForDay() 的地方添加了代码。它在 _buildTableCalendar 函数中。

标签: firebase flutter google-cloud-firestore stream


【解决方案1】:

该错误表示您正在尝试迭代一个为空的列表。

在 null 上调用了 getter 'length'。

您可以通过两种方式解决此错误:

选项 1

您将快照数据提供给 eventDoc var,但您需要更新状态以通知该变量已更改

setState(() => eventDoc = eventsSnapShot.data );

选项 2

其他解决方案是将数据传递给您的方法

StreamBuilder(
        stream: _db.collection('agency').doc(globals.agencyId).collection('event')
          .where('eventDate', isGreaterThanOrEqualTo: kFirstDay)
          .where('eventDate', isLessThanOrEqualTo: kLastDay)
                .snapshots().map((snapshot) => snapshot.docs
          .map((document) => Event.fromFirestore(document.data()))
          .toList()),
        builder: (context, AsyncSnapshot <List<Event>> eventsSnapShot) {
          if (eventsSnapShot.hasData) {
            if ( eventsSnapShot.data != null ) {
              return _buildTableCalendar(eventsSnapShot.data); // Passing the data
            }
          } 
          return CircularProgressIndicator();
        },
      ),

// Methods

Widget _buildTableCalendar( List<Event> events ) {}

List<Event> _getEventsForDay( DateTime day, List<Event> event ) {}

【讨论】:

  • 感谢@JesusCoronado 的回复。我已经尝试了这两种解决方案,但我得到了同样的错误。
  • if (eventsSnapShot.hasData) { setState(() => eventDoc = eventsSnapShot.data);返回 _buildTableCalendar(eventsSnapShot.data); } List _getEventsForDay(DateTime day, [List? events]) {}
  • 请在返回_buildTableCalendar(eventsSnapShot.data);之前打印你的snapshot数据,可能是数据列表的转换方式不正确,然后告诉我结果
  • 这是这行代码的输出: print('eventDoc: ' + eventsSnapShot.data.toString()); OUTPUT: eventDoc: null, 它再次循环... OUTPUT: eventDoc: ['Event'的实例,'Event'的实例,'Event'的实例]
  • 如果我评估 eventsSnapshot.data 我会看到数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-15
  • 1970-01-01
  • 2018-11-15
  • 1970-01-01
  • 1970-01-01
  • 2014-05-02
  • 2015-08-06
相关资源
最近更新 更多