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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:12:34