Flutter依赖注入插件injecteo的使用
Flutter依赖注入插件injecteo的使用
介绍
Injecteo
是一个方便使用服务定位器模式(Service Locator Pattern)来建立依赖注入配置的Flutter插件。它通过注解简化了依赖的注册过程,并且生成相应的配置代码。
目录
为什么选择injecteo
Injecteo
使用注解标记需要作为依赖项的类,从而轻松实现单例或工厂实例的访问,消除类之间的紧密耦合。该插件提供了一个依赖配置生成器 injecteo_generator
,进一步简化了依赖管理。
动机
该库遵循广泛使用的 get_it
库的原则,但与手动注册不同的是,Injecteo
提供了类似 injectable
的生成器。其额外的好处包括抽象的服务定位器接口、对 get_it
的包装以及环境特定的依赖注册支持。
设置
安装包和生成器
你可以通过命令行安装 Injecteo
及其生成器:
flutter pub add injecteo
flutter pub add --dev injecteo_generator
或者在 pubspec.yaml
文件中手动添加依赖:
dependencies:
injecteo:
dev_dependencies:
injecteo_generator:
运行生成器
运行以下命令以生成依赖注入配置:
flutter run build_runner build
调用生成的函数
创建一个新的文件并定义全局的 ServiceLocator
实例,然后定义一个顶级函数并使用 [@injecteoConfig](/user/injecteoConfig)
注解标记它。最后,在应用程序启动前调用这个顶级函数。
示例代码:
import 'package:injecteo/injecteo.dart';
import 'di.config.dart'; // 确保导入生成的配置文件
final sl = GetItServiceLocator.instance;
[@injecteoConfig](/user/injecteoConfig)
Future<void> configureDependencies(String env) => $injecteoConfig(
sl,
environment: env,
);
void main() async {
await configureDependencies('dev'); // 根据需要选择环境
runApp(MyApp());
}
注解
@injecteoConfig
标记一个顶级函数为配置函数。此函数将用于初始化所有项目中标记的依赖项。
参数:
参数 | 类型 | 描述 | 示例 |
---|---|---|---|
preferRelativeImports | bool | 是否使用相对路径导入(默认值为 true) | true |
configFunctionName | String | 生成的配置函数名称 | $configureInjecteo |
@InjectionModule
允许逻辑上相关的类分组到模块中,例如授权模块中的类可以放在 AuthorizationInjectionModule
中。
示例:
const counterInjectionModule = InjectionModule(name: "CounterInjectionModule");
[@singleton](/user/singleton)
@counterInjectionModule
class CounterDataSource {
// ...
}
@externalModule
用于注册你不拥有的外部依赖项,比如第三方库 SharedPreferences
或日志库 Logger
。
示例:
[@externalModule](/user/externalModule)
abstract class LoggerConfig {
@dev
LogTree get debugLogTree => DebugTree(useColors: true);
@prod
LogTree get prodLogTree => DebugTree(
useColors: true,
logLevels: ["W", "E"],
);
}
@singleton
用于标记需要唯一实例的类。
示例:
@Singleton(as: HelloRepository)
class HelloRepositoryImpl implements HelloRepository {
// ...
}
@disposeMethod
用于指定如何释放单例实例资源。
示例:
[@singleton](/user/singleton)
class DataSource {
[@disposeMethod](/user/disposeMethod)
void dispose() {
// 处理资源释放逻辑
}
}
@inject
用于标记需要作为工厂创建的类。
示例:
[@inject](/user/inject)
class HelloDataSource {
// ...
}
@factoryMethod
用于指定自定义工厂方法来创建依赖项。
示例:
[@inject](/user/inject)
@userInjectionModule
class UserInfoProvider {
final UserInfo userInfo;
[@factoryMethod](/user/factoryMethod)
static Future<UserInfoProvider> create(UserDataSource userDataSource) async {
final userInfo = await userDataSource.fetch();
return UserInfoProvider(userInfo);
}
}
@Named
用于标记具有多个实现的依赖项,以便根据名称进行区分。
示例:
[@Named](/user/Named)("impl1")
@Singleton(as: HelloService)
class HelloServiceFirstImpl implements HelloService {
@override
String sayHello() => 'Hello from first implementation';
}
[@Named](/user/Named)("impl2")
@Singleton(as: HelloService)
class HelloServiceSecondImpl implements HelloService {
@override
String sayHello() => 'Hello from second implementation';
}
@preResolve
用于需要异步初始化的依赖项。
示例:
[@externalModule](/user/externalModule)
abstract class StorageModule {
[@preResolve](/user/preResolve)
Future<SharedPreferences> get prefs => SharedPreferences.getInstance();
}
@Environment
用于根据不同的环境注册不同的依赖项。
示例:
[@externalModule](/user/externalModule)
abstract class ApiConfig {
@dev
String get devApiUrl => "https://iteo.com";
@prod
String get prodApiUrl => "https://iteo.com";
}
故障排除
如果遇到生成文件冲突或错误,请尝试清理并重新构建:
flutter pub run build_runner clean
更多关于Flutter依赖注入插件injecteo的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html