Flutter for OpenHarmony:injector 轻量级依赖注入库(比 GetIt 更简单的选择) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

前言

依赖注入(Dependency Injection, DI)是解耦架构的核心。

在 Flutter 社区,get_it 是当之无愧的霸主,但有时候我们想要一个更简单、没有 Service Locator 模式那种"全局单例"味道的库,或者需要一个支持模块化注入的方案。

injector 是一个非常轻量的 DI 库。它不使用代码生成,提供基于构建器(Builder)的依赖注册机制。

对于 OpenHarmony 开发者,使用 DI 库可以将鸿蒙特定的实现(如 OhosPermissionService)与通用业务逻辑解耦,实现一套代码,多端运行。

一、核心原理

injector 的工作原理非常纯粹:它维护了一个 Map,Key 是类型,Value 是构建该类型的工厂函数。
map
get()
Singleton
Factory
注册阶段
Injector 容器
检查缓存?
返回单例
创建新实例
业务代码

二、OpenHarmony 适配说明

injectorPure Dart 库,100% 兼容 OpenHarmony

它非常适合用来屏蔽鸿蒙与 Android/iOS 的 API 差异。

架构建议

定义一个抽象类 PermissionService,然后在 Android 上注册 AndroidPermissionImpl,在鸿蒙上注册 OhosPermissionImpl

三、基础用例

3.1 获取实例

injector 默认提供了一个全局单例 Injector.appInstance

dart 复制代码
import 'package:injector/injector.dart';

class Database {
  void open() => print('DB opened');
}

void setup() {
  final injector = Injector.appInstance;
  
  // 注册为单例
  injector.registerSingleton<Database>(() => Database());
}

void main() {
  setup();
  
  // 获取实例
  final db = Injector.appInstance.get<Database>();
  db.open();
}

3.2 依赖其他依赖

dart 复制代码
class ApiService {}

class UserRepository {
  final ApiService api;
  final Database db;
  
  UserRepository(this.api, this.db);
}

void setupComplex() {
  final injector = Injector.appInstance;

  injector.registerSingleton<ApiService>(() => ApiService());
  
  // 在注册回调中,使用 injector 获取其他依赖
  injector.registerDependency<UserRepository>(() {
    return UserRepository(
      injector.get<ApiService>(),
      injector.get<Database>(),
    );
  });
}

四、完整实战示例:鸿蒙多环境适配

这个示例展示了如何使用 injector 来根据当前运行环境(Mock环境 vs 鸿蒙真机环境)注入不同的服务实现。这在开发阶段非常有用,可以让你在没有真机的情况下开发业务逻辑。

dart 复制代码
import 'package:injector/injector.dart';

// 1. 定义抽象接口
abstract class DeviceInfoService {
  String getOSName();
}

// 2. 鸿蒙真机实现
class OhosDeviceInfoService implements DeviceInfoService {
  @override
  String getOSName() => 'OpenHarmony 5.0';
}

// 3. 模拟环境实现
class MockDeviceInfoService implements DeviceInfoService {
  @override
  String getOSName() => 'Mock OS';
}

// 4. DI 配置类
class DependencyConfig {
  static void configure({bool isMock = false}) {
    final injector = Injector.appInstance;
    
    // 清理旧的(支持热重载)
    injector.clearAll();

    if (isMock) {
      print('🔧 注入 Mock 服务');
      injector.registerSingleton<DeviceInfoService>(() => MockDeviceInfoService());
    } else {
      print('📱 注入真实鸿蒙服务');
      injector.registerSingleton<DeviceInfoService>(() => OhosDeviceInfoService());
    }
  }
}

// 5. 业务页面
class HomePage {
  void showInfo() {
    // 业务代码只依赖抽象接口,不关心具体是谁
    final service = Injector.appInstance.get<DeviceInfoService>();
    print('当前系统: ${service.getOSName()}');
  }
}

void main() {
  // 场景 A: 单元测试或电脑运行
  DependencyConfig.configure(isMock: true);
  HomePage().showInfo(); // 输出: Mock OS
  
  print('--- 切换环境 ---');

  // 场景 B: 鸿蒙真机运行
  DependencyConfig.configure(isMock: false);
  HomePage().showInfo(); // 输出: OpenHarmony 5.0
}

五、总结

injector 虽然不如 get_it 功能繁多,但胜在简单直观

对于中小型 OpenHarmony 项目,或者想要快速验证原型,injector 提供的"注册-获取"模式没有任何样板代码负担。

掌握 DI 思想,是写出可测试、可维护鸿蒙应用的第一步。

相关推荐
欧神附体12310 小时前
计算机网络之专业名词中英文解释(第一弹)
网络
ylscode10 小时前
Pentest Swarm AI:开源群体智能架构如何重构自主渗透测试的边界
网络·安全·安全威胁分析
weixin_4296302610 小时前
3.51 Centra-Net:一种跨场景的集中式视觉定位网络
网络
Goway_Hui10 小时前
【鸿蒙原生应用开发--ArkUI--013】Exercise-tracker 运动记录应用开发教程
华为·harmonyos
想你依然心痛10 小时前
HarmonyOS 6(API 23)实战:基于悬浮导航、沉浸光感与HMAF的“图谱智脑“——PC端AI智能体沉浸式知识图谱构建工作台
人工智能·ar·知识图谱·harmonyos·智能体
yivifu10 小时前
CSS 自动级联编号有序列表完全指南
前端·css·c#·html·有序列表·级联编号
想你依然心痛11 小时前
HarmonyOS 6(API 23)实战:基于悬浮导航、沉浸光感与HMAF的“律界智脑“——PC端AI智能体沉浸式法律文档智能审查工作台
人工智能·华为·ar·harmonyos·智能体
福大大架构师每日一题11 小时前
rust 1.96.0 更新:语言、编译器、Cargo、Rustdoc、兼容性全面升级,必看完整解读
android·开发语言·rust
特立独行的猫a11 小时前
鸿蒙 PC 平台 Python 第三方库移植全景指南
python·华为·harmonyos·三方库移植·鸿蒙pc
江华森11 小时前
Linux 内核调优 + TCP/IP 协议栈深度解析 + 低延迟网络优化
linux·网络·tcp/ip