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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:36:07