list - Flutter calendar Firestore“类型'QuerySnapshot'不是'List'类型的子类型'"
问题描述
) 我尝试编写一个日历应用程序,每个用户都有自己的事件。我想从 Firestore 流式传输事件,但总是有错误消息“类型'QuerySnapshot'不是'List'类型的子类型”。错误信息
我认为问题出在主文件中的 StreamBuilder 中。
如果有人能告诉我如何解决这个错误,我会非常高兴。
提前感谢所有试图帮助我的人。
这是我的主文件:
class KalenderTable extends StatefulWidget {
@override
_KalenderTableState createState() => _KalenderTableState();
}
class _KalenderTableState extends State<KalenderTable> {
CalendarController _controller;
Map<DateTime, List<dynamic>> _events;
List<dynamic> _selectedEvents;
Stream events;
@override
void initState() {
getUserInfogetEvents();
super.initState();
_controller = CalendarController();
_events = {};
_selectedEvents = [];
}
Map<DateTime, List<dynamic>> _groupEvents(List<EventModel> allEvents) {
Map<DateTime, List<dynamic>> data = {};
allEvents.forEach((event) {
DateTime date = DateTime(
event.eventDate.year, event.eventDate.month, event.eventDate.day, 12);
if (data[date] == null) data[date] = [];
data[date].add(event);
});
return data;
}
getUserInfogetEvents() async {
Constants.myName = await HelperFunctions.getUserEmailSharedPreference();
DatabaseKalenderMethods().getUserEvents(Constants.myName).then((snapshots) {
setState(() {
events = snapshots;
print(
"we got the data + ${events.toString()} this is name ${Constants.myName}");
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: StreamBuilder(
stream: events,
builder: (context, snapshot) {
if (snapshot.hasData) {
List<EventModel> allEvents = snapshot.data;
if (allEvents.isNotEmpty) {
_events = _groupEvents(allEvents);
} else {
_events = {};
_selectedEvents = [];
}
}
return SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
TableCalendar(
events: _events,
initialCalendarFormat: CalendarFormat.twoWeeks,
calendarStyle: CalendarStyle(
canEventMarkersOverflow: true,
todayColor: Colors.orange,
selectedColor: Colors.cyan,
todayStyle: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 18.0,
color: Colors.white)),
headerStyle: HeaderStyle(
centerHeaderTitle: true,
formatButtonDecoration: BoxDecoration(
color: Colors.cyan,
borderRadius: BorderRadius.circular(20.0),
),
formatButtonTextStyle: TextStyle(color: Colors.white),
formatButtonShowsNext: false,
),
startingDayOfWeek: StartingDayOfWeek.monday,
onDaySelected: (date, events) {
setState(() {
_selectedEvents = events;
});
},
builders: CalendarBuilders(
selectedDayBuilder: (context, date, events) => Container(
margin: const EdgeInsets.all(4.0),
alignment: Alignment.center,
decoration: BoxDecoration(
color: Theme.of(context).primaryColor,
borderRadius: BorderRadius.circular(10.0)),
child: Text(
date.day.toString(),
style: TextStyle(color: Colors.white),
)),
todayDayBuilder: (context, date, events) =>
Container(
margin: const EdgeInsets.all(4.0),
alignment: Alignment.center,
decoration: BoxDecoration(
color: Colors.orange,
borderRadius: BorderRadius.circular(10.0)),
child: Text(
date.day.toString(),
style: TextStyle(color: Colors.white),
)),
),
calendarController: _controller,
),
..._selectedEvents.map((event) => ContainerKalender(
event.title,
() {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => EventDetailsPage(
event: event,
)));
},
() {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => EventDetailsPage(
event: event,
)));
},
)),
],
),
);
}),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.add),
backgroundColor: Colors.cyan,
onPressed: () => Navigator.pushNamed(context, 'add_event'),
),
);
}
}
class EventModel extends DatabaseItem{
final String id;
final String title;
final String description;
final DateTime eventDate;
EventModel({this.id,this.title, this.description, this.eventDate}):super(id);
factory EventModel.fromMap(Map data) {
return EventModel(
title: data['title'],
description: data['description'],
eventDate: data['event_date'],
);
}
factory EventModel.fromDS(String id, Map<String,dynamic> data) {
return EventModel(
id: id,
title: data['title'],
description: data['description'],
eventDate: data['event_date'].toDate(),
);
}
Map<String,dynamic> toMap() {
return {
"title":title,
"description": description,
"event_date":eventDate,
"id":id,
};
}
}
这是我的 Firebase 连接:
class DatabaseKalenderMethods {
getUserEvents(String itIsMyName) async {
return await Firestore.instance
.collection("kalender")
.where('users', arrayContains: itIsMyName)
.snapshots();
}
}
解决方案
我猜问题出在这里:
List<EventModel> allEvents = snapshot.data;
这是因为(仍在猜测) in events = snapshots;
, thesnapshots
是 a Stream<QuerySnapshot>
。
请参阅此答案以映射流。
推荐阅读
- java - 在 JAVA 的 Catch 块中处理多个 Throwable
- bash - 使用 shell 脚本将文本替换为 pwd
- perl - 如何在 perl 中格式化从 XML::LibXML 创建的 xml
- javascript - 来自 location.href 的 URL 缺少 searchParams
- angular - Ionic 4 导航返回时丢失堆栈指针
- python - 为什么我的 tkinter 窗口不显示我的面板?
- javascript - 如何在php中显示查看文章帖子的用户列表
- python-3.x - 允许 0.0.0.0/0 的所有 SG 列表 - 使用 Python 的 AWS Lambda
- c# - File.Create 和 File.OpenWrite 不会释放文件,即使它已关闭并且也已处置
- matlab - 如何从 MATLAB 中的字符向量中提取某些单词?