You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Dart与Flutter结合Google Calendar API获取用户日历事件列表?

Flutter 对接 Google Calendar API 实战指南

嘿,我最近也在折腾Flutter对接Google Calendar API,太懂你这种对着简陋文档抓瞎、翻遍StackOverflow才凑代码的感觉了!下面是我验证过的可行方案,帮你少踩点坑:

第一步:配置依赖

先在pubspec.yaml里补上必要的包,版本尽量用最新稳定版:

dependencies:
  flutter:
    sdk: flutter
  googleapis: ^12.0.0
  googleapis_auth: ^1.4.1
  http: ^1.1.0
  # 移动端需要加这个做Google登录
  google_sign_in: ^6.1.5

第二步:搞定认证(最坑的环节!)

googleapis_auth的文档确实太简略,我当时也是翻了N多讨论才摸清楚逻辑。核心是拿到AuthClient,这里分移动端和桌面/后端两种场景,先讲最常用的移动端方案:

移动端Google登录+认证代码

import 'package:google_sign_in/google_sign_in.dart';
import 'package:googleapis/calendar/v3.dart';
import 'package:googleapis_auth/auth.dart';
import 'package:googleapis_auth/auth_io.dart';
import 'package:http/http.dart' as http;

// 初始化Google登录,指定需要的权限范围
final GoogleSignIn _googleSignIn = GoogleSignIn(
  scopes: [
    CalendarApi.calendarReadonlyScope, // 只读权限
    // 如果需要修改日历事件,换成CalendarApi.calendarScope
  ],
);

// 获取认证后的客户端
Future<http.Client?> getAuthClient() async {
  try {
    // 唤起Google登录
    final GoogleSignInAccount? account = await _googleSignIn.signIn();
    if (account == null) {
      print('用户取消登录');
      return null;
    }

    // 获取登录凭证
    final GoogleSignInAuthentication auth = await account.authentication;
    final AccessCredentials credentials = AccessCredentials(
      AccessToken('Bearer', auth.accessToken, DateTime.now().add(const Duration(hours: 1))),
      auth.refreshToken,
      _googleSignIn.scopes,
    );

    // 返回带认证的客户端,它会自动处理令牌刷新
    return authenticatedClient(http.Client(), credentials);
  } catch (e) {
    print('认证出错:$e');
    return null;
  }
}

第三步:调用API获取日历事件

拿到AuthClient后,就可以轻松调用Calendar API了:

Future<void> fetchCalendarEvents() async {
  final http.Client? client = await getAuthClient();
  if (client == null) {
    print('认证失败,无法获取日历数据');
    return;
  }

  final CalendarApi calendarApi = CalendarApi(client);
  try {
    // 调用API获取主日历的最近10条未来事件
    final Events events = await calendarApi.events.list(
      'primary', // 主日历ID,也可以替换成其他日历的ID
      maxResults: 10,
      singleEvents: true, // 把重复事件拆成单个事件返回
      orderBy: 'startTime',
      timeMin: DateTime.now(), // 只获取当前时间之后的事件
    );

    if (events.items == null || events.items!.isEmpty) {
      print('没有找到符合条件的日历事件');
      return;
    }

    // 遍历打印事件信息
    for (var event in events.items!) {
      print('📅 事件标题:${event.summary ?? '无标题'}');
      print('⏰ 开始时间:${event.start?.dateTime ?? event.start?.date}');
      print('⏳ 结束时间:${event.end?.dateTime ?? event.end?.date}');
      print('---');
    }
  } catch (e) {
    print('获取日历事件出错:$e');
  } finally {
    client.close(); // 记得关闭客户端释放资源
  }
}

踩过的关键坑提醒

  • Google Cloud Console配置:一定要先在控制台启用Calendar API,配置OAuth同意屏幕,添加测试用户(未发布的应用只能给测试用户用)
  • 权限范围:根据需求选对权限,只读用calendarReadonlyScope,读写用calendarScope,权限不够会直接报错
  • iOS额外配置:iOS需要在Info.plist里添加Google Sign-In的URL Scheme等配置,具体看google_sign_in插件的说明
  • 令牌自动刷新:authenticatedClient会自动用refreshToken刷新过期的accessToken,不用自己写刷新逻辑

内容的提问来源于stack exchange,提问作者Evgeny Astapov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:48:15