Flutter日历教程问题SOS
Flutter calendar tutorial issue SOS
我正在按照 this 教程在我的 flutter 应用程序中制作日历。出于某种原因,当您单击带有事件的日期时,事件没有显示:
如您所见,当我点击有活动的 9 时,它并没有像视频中那样显示。我不太确定为什么没有发生这种情况,因为我完全按照教程进行操作并且只是更改了颜色。
这是代码:
class SecondRoute extends StatefulWidget {
@override
_SecondRoute createState() => _SecondRoute();
}
class _SecondRoute extends State<SecondRoute> {
CalendarController _controller;
Map<DateTime, List<dynamic>> _events;
List<dynamic> _selectedEvents;
@override
void initState() {
super.initState();
_controller = CalendarController();
_events = {};
_selectedEvents = [];
}
Map<DateTime, List<dynamic>> _groupEvents(List<EventModel> events) {
Map<DateTime, List<dynamic>> data = {};
events.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;
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Color(0xFF030164),
appBar: AppBar(
title: Text('Calendar'),
),
body: StreamBuilder<List<EventModel>>(
stream: eventDBS.streamList(),
builder: (context, snapshot) {
if (snapshot.hasData) {
List<EventModel> allEvents = snapshot.data;
if (allEvents.isNotEmpty) {
_events = _groupEvents(allEvents);
}
}
return SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
TableCalendar(
events: _events,
initialCalendarFormat: CalendarFormat.month,
calendarStyle: CalendarStyle(
canEventMarkersOverflow: true,
todayColor: Color(0xFF974FF9),
selectedColor: Theme.of(context).primaryColor,
todayStyle: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 18.0,
color: Colors.white)),
headerStyle: HeaderStyle(
centerHeaderTitle: true,
formatButtonDecoration: BoxDecoration(
color: Color(0xFF974FF9),
borderRadius: BorderRadius.circular(20.0),
),
formatButtonTextStyle: TextStyle(color: Colors.white),
formatButtonShowsNext: false,
),
startingDayOfWeek: StartingDayOfWeek.monday,
onDaySelected: (context, 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: Color(0xFF974FF9),
borderRadius: BorderRadius.circular(10.0)),
child: Text(
date.day.toString(),
style: TextStyle(color: Colors.white),
)),
),
calendarController: _controller,
),
..._selectedEvents.map((event) => ListTile(
title: Text(event.title),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => EventDetailsPage(
event: event,
)));
},
)),
],
),
);
}),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.add),
backgroundColor: Color(0xff17F0FC),
onPressed: () => Navigator.pushNamed(context, 'add_event'),
));
}
}
如有任何帮助,我们将不胜感激!
我发现了问题,在 onDaySelected
中,(context, date, events)
应该像 (date, events, context)
那样排序:
onDaySelected: (date, events, context) {
setState(() {
_selectedEvents = events;
});
},
我正在按照 this 教程在我的 flutter 应用程序中制作日历。出于某种原因,当您单击带有事件的日期时,事件没有显示:
如您所见,当我点击有活动的 9 时,它并没有像视频中那样显示。我不太确定为什么没有发生这种情况,因为我完全按照教程进行操作并且只是更改了颜色。
这是代码:
class SecondRoute extends StatefulWidget {
@override
_SecondRoute createState() => _SecondRoute();
}
class _SecondRoute extends State<SecondRoute> {
CalendarController _controller;
Map<DateTime, List<dynamic>> _events;
List<dynamic> _selectedEvents;
@override
void initState() {
super.initState();
_controller = CalendarController();
_events = {};
_selectedEvents = [];
}
Map<DateTime, List<dynamic>> _groupEvents(List<EventModel> events) {
Map<DateTime, List<dynamic>> data = {};
events.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;
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Color(0xFF030164),
appBar: AppBar(
title: Text('Calendar'),
),
body: StreamBuilder<List<EventModel>>(
stream: eventDBS.streamList(),
builder: (context, snapshot) {
if (snapshot.hasData) {
List<EventModel> allEvents = snapshot.data;
if (allEvents.isNotEmpty) {
_events = _groupEvents(allEvents);
}
}
return SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
TableCalendar(
events: _events,
initialCalendarFormat: CalendarFormat.month,
calendarStyle: CalendarStyle(
canEventMarkersOverflow: true,
todayColor: Color(0xFF974FF9),
selectedColor: Theme.of(context).primaryColor,
todayStyle: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 18.0,
color: Colors.white)),
headerStyle: HeaderStyle(
centerHeaderTitle: true,
formatButtonDecoration: BoxDecoration(
color: Color(0xFF974FF9),
borderRadius: BorderRadius.circular(20.0),
),
formatButtonTextStyle: TextStyle(color: Colors.white),
formatButtonShowsNext: false,
),
startingDayOfWeek: StartingDayOfWeek.monday,
onDaySelected: (context, 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: Color(0xFF974FF9),
borderRadius: BorderRadius.circular(10.0)),
child: Text(
date.day.toString(),
style: TextStyle(color: Colors.white),
)),
),
calendarController: _controller,
),
..._selectedEvents.map((event) => ListTile(
title: Text(event.title),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => EventDetailsPage(
event: event,
)));
},
)),
],
),
);
}),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.add),
backgroundColor: Color(0xff17F0FC),
onPressed: () => Navigator.pushNamed(context, 'add_event'),
));
}
}
如有任何帮助,我们将不胜感激!
我发现了问题,在 onDaySelected
中,(context, date, events)
应该像 (date, events, context)
那样排序:
onDaySelected: (date, events, context) {
setState(() {
_selectedEvents = events;
});
},