Flutter中如何使用get_it的RegisterLazySingleton并跨类调用已注册依赖
get_it 注册依赖后的调用方案
前置要求
你注册PackageInfo时用了异步初始化逻辑,所以必须先等待注册完成再调用依赖,否则会报未注册错误,建议在main函数里先完成初始化:
void main() async { WidgetsFlutterBinding.ensureInitialized(); // 等待所有get_it依赖注册完成 await _registerPackage(); runApp(const MyApp()); }
两种常用调用方式
1. 直接通过全局di实例获取(最常用)
你在配置文件里已经定义了全局的di实例,只需要在要使用的地方导入配置文件,直接调用泛型方法就能拿到实例:
// 导入你存放get_it配置的文件 import 'path/to/your/get_it_config.dart'; class HomePage extends StatelessWidget { const HomePage({super.key}); @override Widget build(BuildContext context) { // 直接获取已注册的PackageInfo单例 final packageInfo = di<PackageInfo>(); return Text('当前应用版本:${packageInfo.version}'); } }
你也可以写成di.get<PackageInfo>(),和上面的写法效果完全一致。
2. 构造函数注入(适合需要单元测试的场景)
这种方式可以降低类和get_it的耦合,方便测试时传入Mock实例:
// 导入get_it配置文件 import 'path/to/your/get_it_config.dart'; class AppConfig { final PackageInfo packageInfo; // 没传参的话默认从get_it取实例,测试时可以手动传入Mock对象 AppConfig({PackageInfo? packageInfo}) : packageInfo = packageInfo ?? di<PackageInfo>(); String get packageName => packageInfo.packageName; } // 使用时直接初始化即可,不需要手动传参数 final appConfig = AppConfig();
注意事项
registerLazySingleton注册的单例,只有第一次被调用时才会执行实例创建逻辑,之后所有调用返回的都是同一个实例- 必须确保调用依赖前,对应类型已经完成注册,否则会抛出找不到注册项的运行时错误
内容的提问来源于stack exchange,提问作者Alessandro Antonio Del Gaudio
相关产品推荐
相关产品推荐

