如何让flutter calendar显示谷歌日历事件?

问题描述 投票:0回答:1
class CalendarEvents extends StatefulWidget {
@override
CalendarEventsState createState() => CalendarEventsState();
}

class CalendarEventsState extends State<CalendarEvents> {
  final GoogleSignIn _googleSignIn = GoogleSignIn(
clientId:
'571891879876-rcjtmo4lds0qlhvi9ar5sk78gubnub7f.apps.googleusercontent.com',
scopes: <String>[
  googleAPI.CalendarApi.calendarScope,
],
);
@override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: new AppBar(
            title: Text('Event Calendar'),
          ),
          body: Container(
            child: FutureBuilder(
              future: getGoogleEventsData(),
              builder: (BuildContext context, AsyncSnapshot snapshot) {
                return Container(
                    child: Stack(
                      children: [
                        Container(
                          child: SfCalendar(
                            view: CalendarView.month,
                            initialDisplayDate: DateTime(2020,7,15,9,0,0),
                            dataSource: GoogleDataSource(events: snapshot.data),
                            monthViewSettings: MonthViewSettings(
                                appointmentDisplayMode:
                                MonthAppointmentDisplayMode.appointment),
                          ),
                        ),
                        snapshot.data != null
                            ? Container()
                            : Center(
                          child: CircularProgressIndicator(),
                        )
                      ],
                    ));
              },
            ),
          ),
        );
      }
    
      @override
      void dispose(){
        if(_googleSignIn.currentUser != null) {
          _googleSignIn.disconnect();
          _googleSignIn.signOut();
        }
    
        super.dispose();
      }
    
      Future<List<googleAPI.Event>> getGoogleEventsData() async {
        final GoogleSignInAccount? googleUser = await _googleSignIn.signIn();
        final GoogleAPIClient httpClient =
        GoogleAPIClient(await googleUser!.authHeaders);
        final googleAPI.CalendarApi calendarAPI = googleAPI.CalendarApi(httpClient);
        final googleAPI.Events calEvents = await calendarAPI.events.list(
          "primary",
        );
        final List<googleAPI.Event> appointments = <googleAPI.Event>[];
        if (calEvents.items != null) {
          for (int i = 0; i < calEvents.items!.length; i++) {
            final googleAPI.Event event = calEvents.items![i];
            if (event.start == null) {
              continue;
            }
            appointments.add(event);
          }
        }
        return appointments;
      }
    }
    
    class GoogleDataSource extends CalendarDataSource {
      GoogleDataSource({required List<googleAPI.Event>? events}) {
        this.appointments = events;
      }
    
      @override
      DateTime getStartTime(int index) {
        final googleAPI.Event event = appointments![index];
        return event.start!.date ?? event.start!.dateTime!.toLocal();
      }
    
      @override
      bool isAllDay(int index) {
        return appointments![index].start.date != null;
      }
    
      @override
      DateTime getEndTime(int index) {
        final googleAPI.Event event = appointments![index];
        return event.endTimeUnspecified != null && event.endTimeUnspecified!
            ? (event.start!.date ?? event.start!.dateTime!.toLocal())
            : (event.end!.date != null
            ? event.end!.date!.add(Duration(days: -1))
            : event.end!.dateTime!.toLocal());
      }
    
      @override
      String getLocation(int index) {
        return appointments![index].location;
      }
    
      @override
      String getNotes(int index) {
        return appointments![index].description;
      }
    
      @override
      String getSubject(int index) {
        final googleAPI.Event event = appointments![index];
        return event.summary!;
      }
    }
    
    class GoogleAPIClient extends IOClient {
      Map<String, String> _headers;
    
      GoogleAPIClient(this._headers) : super();
    
      @override
      Future<IOStreamedResponse> send(BaseRequest request) =>
          super.send(request..headers.addAll(_headers));
    
      @override
      Future<Response> head(Object url, {  Map<String, String>? headers}) {
        var uri = Uri.parse("$url");
          super.head(uri, headers: headers!..addAll(_headers));
        throw '';
        }
      }

我想检索 google id 中发生的所有 google 日历事件。我想在 firebase 和 google calendar api 的帮助下显示syncfusion日历中的所有事件。我在 syncfusion 博客 上找到了这段代码。但它不起作用,谷歌登录后屏幕上只显示圆形进度指示器。有人可以检查一下代码吗?

firebase flutter dart google-calendar-api syncfusion
1个回答
0
投票

你找到解决办法了吗?我现在需要它,拜托

© www.soinside.com 2019 - 2024. All rights reserved.