Dart是否支持文件加载时执行代码?无代码生成DI遇阻
Dart 实现文件加载时自动执行依赖注册的方案
Dart 本身没有像 CommonLisp 那样文件加载阶段自动执行任意代码的机制——它的顶层代码(包括变量初始化、顶层函数)都是懒加载的:只有当代码被主动引用(比如访问顶层变量、调用顶层函数)时,所在库的初始化逻辑才会触发。你遇到的顶层变量final reg = MailRepo.register();只有在reg被访问时才会执行注册,就是这个原因。
下面是几个可行的解决方案,确保依赖注册在使用provide<MailRepo>()前执行:
手动在入口触发初始化
这是最直接可靠的方式:把所有依赖注册逻辑封装到一个顶层函数,然后在应用入口(比如main()函数最开始)显式调用。
示例:// di.dart void registerDependencies() { MailRepo.register(); // 其他依赖的注册逻辑都放这里 }// main.dart import 'di.dart'; void main() { registerDependencies(); // 先执行所有依赖注册 runApp(MyApp()); // 再启动应用 // 之后就能正常使用provide<MailRepo>()了 }利用顶层变量“强制触发”(需注意树摇问题)
如果不想手动调用函数,可以把注册逻辑放到一个顶层函数里,再用一个不使用的顶层变量来触发它:// di.dart void _registerAll() { MailRepo.register(); } // 用一个未被使用的顶层变量触发函数执行,前提是这个库被导入到入口文件 final _ = _registerAll();但要注意:如果你的项目开启了代码树摇(比如Flutter默认开启),没被引用的代码可能会被移除,导致注册逻辑不执行。所以这种方式不如手动调用可靠。
统一管理依赖注册库
如果有多个DI模块,可以创建一个专门的init_dependencies.dart,导入所有需要注册的模块并执行初始化,然后在入口只需要导入这个文件并调用一次初始化函数即可:// init_dependencies.dart import 'di.dart'; import 'other_di.dart'; void initAllDependencies() { registerDependencies(); registerOtherDependencies(); }
内容的提问来源于stack exchange,提问作者Hpbbs
相关产品推荐
相关产品推荐

