Error loading events from Google calendar to calendar_view in Flutter application

33 Views Asked by At

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(),
              ),
            ),
          );
        },
      ),
    );
  }
}
0

There are 0 best solutions below