I have a Flutter project here into which I correctly load events from Google Calendar, but the problem is that when I try to display these events in a calendar using the calendar_view package, I always get an error: Error loading events: Unexpected null value.
The events are loaded correctly, and the "date", "endDate", and "title" items are available and are never nil, as seen in my logs:
start: 2016-04-15 18:00:00.000Z
end: 2016-04-15 19:00:00.000Z
start: 2017-04-01 13:30:00.000Z
end: 2017-04-01 14:30:00.000Z
start: 2017-04-01 14:49:00.000Z
end: 2017-04-02 14:49:00.000Z
Error loading events: Unexpected null value.
What might I be doing wrong?
Flutter code:
import 'package:flutter/material.dart';
import 'package:googleapis_auth/auth_io.dart';
import 'package:googleapis/calendar/v3.dart' as google_calendar;
import 'package:http/http.dart' as http;
import 'package:shared_preferences/shared_preferences.dart';
import 'package:calendar_view/calendar_view.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
final EventController _controller = EventController();
@override
Widget build(BuildContext context) {
return CalendarControllerProvider(
controller: _controller,
child: MaterialApp(
home: Calendar(),
),
);
}
}
class Calendar extends StatefulWidget {
@override
_CalendarState createState() => _CalendarState();
}
class _CalendarState extends State<Calendar> {
late EventController _controller;
@override
void initState() {
super.initState();
_controller = EventController();
WidgetsBinding.instance.addPostFrameCallback((_) {
if (mounted) _loadCalendarEvents();
});
}
Future<void> _loadCalendarEvents() async {
final prefs = await SharedPreferences.getInstance();
final accessToken = prefs.getString('googleAccessToken');
if (accessToken == null) {
print("No access token available.");
return;
}
var client = authenticatedClient(
http.Client(),
AccessCredentials(
AccessToken('Bearer', accessToken, DateTime.now().toUtc().add(Duration(hours: 1))),
null,
['https://www.googleapis.com/auth/calendar.readonly'],
),
);
var calendar = google_calendar.CalendarApi(client);
try {
final events = await calendar.events.list('primary');
for (var googleEvent in events.items ?? []) {
DateTime? start = googleEvent.start?.dateTime ?? googleEvent.start?.date;
DateTime? end = googleEvent.end?.dateTime ?? googleEvent.end?.date;
print("start: $start");
print("end: $end");
if (start == null || end == null) {
print("Event has invalid start or end date: ${googleEvent.summary}");
continue;
}
final event = CalendarEventData(
date: start,
endDate: end,
title: googleEvent.summary ?? "No Title",
);
_controller.add(event);
}
} catch (e) {
print("Error loading events: $e");
} finally {
client.close();
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Calendar'),
),
body: MonthView(
controller: _controller,
onCellTap: (events, date) {
showDialog(
context: context,
builder: (context) => AlertDialog(
content: Column(
mainAxisSize: MainAxisSize.min,
children: events
.map((event) => ListTile(
title: Text(event.title),
subtitle: Text(event.description ?? ''),
))
.toList(),
),
),
);
},
),
);
}
}