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

Dart中依赖注入实现单例的问题求助

单例中实现依赖注入的解决方案

你的代码核心问题在于:单例实例_instance提前用null初始化,而_persistence是final类型,后续无法修改;同时工厂构造器虽然接收persistence参数,但并未将其赋值给单例实例,导致_persistence始终为null。以下是两种可行的修改方案:

方案一:首次调用时初始化单例(适用于启动时即可获取persistence的场景)

调整单例实现,让第一次调用工厂构造器时才创建实例并注入依赖:

class SpaceController extends ChangeNotifier {
  final SpacesPersistence _persistence;

  // 改为可空类型,延迟初始化
  static SpaceController? _instance;

  factory SpaceController({required SpacesPersistence persistence}) {
    // 仅在实例未创建时初始化,确保单例唯一性
    _instance ??= SpaceController._internal(persistence: persistence);
    return _instance!;
  }

  SpaceController._internal({required SpacesPersistence persistence}) : _persistence = persistence;
}

说明:

  • 第一次调用SpaceController(persistence: xxx)时,会创建并初始化单例实例,后续调用都会返回同一个实例
  • 若多次调用时传入不同的persistence,仅第一次的参数生效,后续参数会被忽略,需确保首次传入的依赖正确

方案二:延迟初始化依赖(适用于persistence需异步获取或延迟加载的场景)

将_persistence改为late类型,提供单独的初始化方法:

class SpaceController extends ChangeNotifier {
  // late修饰,延迟初始化
  late SpacesPersistence _persistence;

  static final SpaceController _instance = SpaceController._internal();

  factory SpaceController() {
    return _instance;
  }

  SpaceController._internal();

  // 初始化依赖,建议仅调用一次
  void initPersistence(SpacesPersistence persistence) {
    // 防止重复初始化
    try {
      // 尝试访问_persistence,若未初始化会抛出LateInitializationError
      _persistence.hashCode;
      throw StateError('Persistence has already been initialized');
    } on LateInitializationError {
      _persistence = persistence;
    }
  }
}

说明:

  • 单例实例提前创建,但_persistence在调用initPersistence后才完成初始化
  • 使用_persistence前必须确保已调用initPersistence,否则会抛出LateInitializationError
  • 加入了重复初始化的判断,避免意外覆盖已注入的依赖

内容的提问来源于stack exchange,提问作者Moel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:41:33