Flutter for OpenHarmony:injector 轻量级依赖注入库(比 GetIt 更简单的选择) 深度解析与鸿蒙适配指南
本文介绍了轻量级依赖注入库injector在OpenHarmony开发中的应用。该库采用纯Dart实现,通过Map维护类型与构建函数的映射关系,支持单例和工厂模式。文章展示了如何利用injector实现多环境适配(如Mock环境与鸿蒙真机环境),通过抽象接口与具体实现解耦,使业务代码不依赖具体平台。典型用法包括注册单例、处理依赖关系,以及在不同环境下注入不同的服务实现。这种DI模式有助于提升代码的
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

前言
依赖注入(Dependency Injection, DI)是解耦架构的核心。
在 Flutter 社区,get_it 是当之无愧的霸主,但有时候我们想要一个更简单、没有 Service Locator 模式那种“全局单例”味道的库,或者需要一个支持模块化注入的方案。
injector 是一个非常轻量的 DI 库。它不使用代码生成,提供基于构建器(Builder)的依赖注册机制。
对于 OpenHarmony 开发者,使用 DI 库可以将鸿蒙特定的实现(如 OhosPermissionService)与通用业务逻辑解耦,实现一套代码,多端运行。
一、核心原理
injector 的工作原理非常纯粹:它维护了一个 Map,Key 是类型,Value 是构建该类型的工厂函数。
二、OpenHarmony 适配说明
injector 是 Pure Dart 库,100% 兼容 OpenHarmony。
它非常适合用来屏蔽鸿蒙与 Android/iOS 的 API 差异。
架构建议:
定义一个抽象类 PermissionService,然后在 Android 上注册 AndroidPermissionImpl,在鸿蒙上注册 OhosPermissionImpl。
三、基础用例
3.1 获取实例
injector 默认提供了一个全局单例 Injector.appInstance。
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 依赖其他依赖
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 鸿蒙真机环境)注入不同的服务实现。这在开发阶段非常有用,可以让你在没有真机的情况下开发业务逻辑。
import 'package:injector/injector.dart';
// 1. 定义抽象接口
abstract class DeviceInfoService {
String getOSName();
}
// 2. 鸿蒙真机实现
class OhosDeviceInfoService implements DeviceInfoService {
String getOSName() => 'OpenHarmony 5.0';
}
// 3. 模拟环境实现
class MockDeviceInfoService implements DeviceInfoService {
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 思想,是写出可测试、可维护鸿蒙应用的第一步。
更多推荐

所有评论(0)