Flutter执行timezone时区数据库下载命令报错找不到指定路径
问题修复方案
报错原因
你直接在Flutter的全局pub缓存目录C:\flutter\.pub-cache\hosted\pub.dartlang.org\timezone-0.8.0下执行工具脚本是错误操作。缓存目录下的依赖包仅保留运行时必要的代码,不会安装工具脚本所需的dev依赖(如args、glob、logging等),也不存在运行脚本需要的package_config.json依赖配置文件,因此触发大量依赖找不到的报错。
注意不要直接修改pub缓存目录下的任何文件,修改会全局影响所有依赖该版本包的项目,且清理缓存后改动会丢失。
修复方案
推荐两个方案,优先选方案一:
方案一:直接使用官方预构建的时区数据库
无需手动编译数据库,99%的场景都适用:
- 在你的项目
pubspec.yaml中同时引入两个依赖:
dependencies: timezone: ^0.8.0 tzdata: ^0.1.0
- 执行
flutter pub get安装依赖 - 项目中初始化时区直接调用官方封装好的方法即可:
import 'package:timezone/timezone.dart' as tz; import 'package:tzdata/tzdata.dart'; void main() async { await tz.initializeTimeZones(); // 后续正常使用时区功能即可 }
方案二:手动编译指定2021d版本的时区数据库
如果你确实需要使用特定版本的时区数据,按以下步骤操作:
- 不要在pub缓存目录操作,将timezone 0.8.0版本的源码单独克隆/下载到本地任意非缓存目录,比如
D:\temp\timezone - 进入该目录,执行
dart pub get安装所有依赖(包括脚本需要的dev依赖) - 执行
dart run tool/get -s 2021d,即可正常编译得到对应版本的时区数据库文件 - 编译生成的数据库文件存放在源码的
lib/data目录下,将这些.tzf文件复制到你自己项目的资源目录(如assets/tzdata/),并在pubspec.yaml中声明资源路径 - 项目中初始化时区时,加载你自己的数据库文件即可:
import 'package:flutter/services.dart'; import 'package:timezone/timezone.dart' as tz; void main() async { final byteData = await rootBundle.load('assets/tzdata/2021d.tzf'); tz.initializeDatabase(byteData.buffer.asUint8List()); }
内容的提问来源于stack exchange,提问作者Mohammed Bekele
相关产品推荐
相关产品推荐

