,list,flutter,dart,calendar"/>

首页 > 解决方案 > 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();
  }
}

标签: listflutterdartcalendar

解决方案


我猜问题出在这里:

List<EventModel> allEvents = snapshot.data;

这是因为(仍在猜测) in events = snapshots;, thesnapshots是 a Stream<QuerySnapshot>

请参阅此答案以映射流。


推荐阅读