Flutter配置googleCalendarAPI.json后仍提示文件找不到的问题
问题解决:Flutter读取Google Calendar服务账户JSON文件时的路径错误
问题根源
你用File('assets/googleCalendarAPI.json')直接读取assets文件的方式是错误的。Flutter的assets资源是打包到应用程序包内的,并非存储在设备的文件系统路径中,因此无法通过File类直接访问。
解决方案
需要使用Flutter的rootBundle(来自flutter/services.dart)来加载assets文件,具体修改如下:
1. 导入必要的包
在代码文件顶部添加:
import 'package:flutter/services.dart' show rootBundle;
2. 修改initializeCalendarApi方法
替换原有的文件读取逻辑:
Future<void> initializeCalendarApi() async { // 使用rootBundle加载assets中的JSON文件 final jsonString = await rootBundle.loadString('assets/googleCalendarAPI.json'); final jsonMap = json.decode(jsonString) as Map<String, dynamic>; final credentials = auth.ServiceAccountCredentials.fromJson(jsonMap); final client = await auth.clientViaServiceAccount(credentials, _scopes); _calendarApi = calendar.CalendarApi(client); }
额外检查项
- 确认
pubspec.yaml中assets配置的缩进正确(YAML对缩进敏感,必须用空格而非Tab):flutter: assets: - assets/googleCalendarAPI.json - 执行
flutter pub get命令,确保assets资源被正确注册 - 确认
googleCalendarAPI.json文件确实位于项目根目录下的assets文件夹中(路径大小写要匹配,Flutter对路径大小写敏感)
完整修改后的代码示例
import 'package:flutter/services.dart' show rootBundle; // 保留你原有的其他导入(比如googleapis、googleapis_auth等) Future<void> initializeCalendarApi() async { final jsonString = await rootBundle.loadString('assets/googleCalendarAPI.json'); final jsonMap = json.decode(jsonString) as Map<String, dynamic>; final credentials = auth.ServiceAccountCredentials.fromJson(jsonMap); final client = await auth.clientViaServiceAccount(credentials, _scopes); _calendarApi = calendar.CalendarApi(client); } Future<List<calendar.Event>> fetchWeekEvents(DateTime startDate) async { await initializeCalendarApi(); final calendarId = '(imagine a calendar id here)'; final startTime = startDate.subtract(Duration(days: startDate.weekday - 1)); final endTime = startTime.add(Duration(days: 7)); try { var events = await _calendarApi.events.list( calendarId, timeMin: startTime.toUtc(), timeMax: endTime.toUtc(), singleEvents: true, orderBy: 'startTime', ); return events.items ?? []; } catch (e) { print('Error fetching events: $e'); return []; } }
内容的提问来源于stack exchange,提问作者DizzyDagem
相关产品推荐
相关产品推荐

