firebase - 火场期货
问题描述
这是我学习 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,但我不知道应该如何声明它。请帮忙。
解决方案
该错误意味着您正在尝试迭代一个为空的列表。
在 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 ) {}
推荐阅读
- c# - 从 SQL Server 代理作业将文件上传到 Azure Datalake 不起作用
- c# - 鼠标移动时更新表单文本
- hbase - Apache Atlas 不会从 Zookeeper 的单独集合开始
- firebase - 如何通过 FlatList 将密钥传递到它的 renderItem 中?
- c# - 如何从一个委托调用不同的方法/脚本?
- python-3.7 - 创建 Python 包时导入错误——我的入口点应该在哪里?
- drools - Drools 查询不能很好地扩展
- javascript - swagger-无法识别的响应类型;将内容显示为文本
- python - Django简单历史history_change_reason - 如何从类中设置实例
- docker - 如何在 docker 容器中启用 yum repo