如何使用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
相关产品推荐
相关产品推荐

