如何让Flutter宏在当前项目目录运行?环境变量使用疑问
解决Dart宏编译时获取项目目录及自定义环境变量的问题
问题根源
Dart宏是在编译时隔离环境中执行的,并非运行在项目目录上下文里,默认会使用编译器的工作目录(可能是系统根目录或临时目录),所以直接调用Directory.current无法拿到项目目录。另外,Platform.environment默认只会继承编译器启动时的环境变量,你自定义的变量需要显式传递给编译进程才能被宏读取到。
解决方案1:通过命令行传递项目目录环境变量
在执行Flutter编译/运行命令时,用--dart-define参数注入项目目录或自定义环境变量:
# 运行时传递当前终端所在的项目目录 flutter run --dart-define=PROJECT_DIR=$(pwd) # 构建时同时传递自定义变量 flutter build apk --dart-define=PROJECT_DIR=$(pwd) --dart-define=CUSTOM_VAR=my_custom_value
解决方案2:修改宏代码读取环境变量
更新宏类,从环境变量中读取传递的项目目录,替代直接获取Directory.current:
import 'dart:io'; import 'package:macros/macros.dart'; macro class ExampleMacro implements ClassDeclarationsMacro { const ExampleMacro(); @override void buildDeclarationsForClass(ClassDeclaration classDeclaration, MemberDeclarationBuilder declarationBuilder) { final projectDir = _getProjectDirectory(); declarationBuilder.declareInType( DeclarationCode.fromParts([ " static const String projectDirectory = '$projectDir';", // 读取自定义环境变量 " static const String? customVar = '${Platform.environment['CUSTOM_VAR'] ?? ''}';", ]), ); } String _getProjectDirectory() { try { // 读取通过--dart-define传递的环境变量 final projectDir = Platform.environment['PROJECT_DIR']; return projectDir ?? '无法获取项目目录,请通过--dart-define传递PROJECT_DIR参数'; } catch (e) { return e.toString(); } } }
IDE运行配置补充
如果在Android Studio/IntelliJ中运行,需要在运行配置里添加--dart-define参数:
- 打开"Run/Debug Configurations"
- 在"Additional run args"输入框中添加:
--dart-define=PROJECT_DIR=/你的项目绝对路径
关键注意事项
- 宏的执行环境是编译期沙箱,无法直接访问项目运行时的文件系统或上下文,必须通过编译参数传递所需信息
--dart-define参数会被编译进程序,建议传递绝对路径,避免相对路径的歧义
内容的提问来源于stack exchange,提问作者KarlFri
相关产品推荐
相关产品推荐

