Flutter插件功能探索之registry插件的使用
Flutter插件功能探索之registry插件的使用
在Flutter开发中,插件的使用可以极大地提升开发效率。本文将介绍一款名为registry
的插件,它是一个轻量级的服务定位器(Service Locator),用于Dart和Flutter项目中实现依赖注入。该插件无需任何依赖,也无需代码生成,非常适合快速构建项目。
快速服务定位器
registry
插件提供了一个简单易用的服务定位器,支持以下特性:
- 支持懒加载单例模式、立即加载单例模式和懒加载工厂模式。
- 支持复杂的依赖注入参数传递。
- 提供便捷的方法来注册、获取、移除对象,并检查对象是否已注册。
快速开始
1. 初始化服务定位器
首先,我们需要初始化Registry
实例并设置调试日志打印:
print('1. Init service locator');
final sl = Registry()..debugLog = print;
2. 注册对象
接下来,我们将一个接口类型IDummyClass
绑定到其实现类DummyClassImpl1
。我们还可以通过params
字段传递额外的参数:
print('2. Register object');
sl.put<IDummyClass>(
(get, params) => DummyClassImpl1(params?.byName('param') ?? 'No param'),
onDispose: (instance) => instance.dispose(),
);
3. 解析对象
通过调用get
方法从服务定位器中解析对象。这里我们传递了带有参数的对象RegistrationParams.named
:
final params = RegistrationParams.named({'param': 'Param123'});
print('3. Resolve object');
final object = sl.get<IDummyClass>(params: params) as DummyClassImpl1;
print('4. Check the param of the resolved object: ${object.getParam()}');
4. 移除对象
当不再需要某个对象时,可以通过remove
方法将其从服务定位器中移除:
print('5. Remove object');
sl.remove<IDummyClass>();
5. 检查对象状态
最后,我们可以检查该对象是否仍然注册在服务定位器中:
print('6. Check if still registered');
print(sl.isRegistered<IDummyClass>());
完整示例代码
以下是完整的代码示例:
import 'package:registry/registry.dart';
void main() {
print('1. Init service locator');
final sl = Registry()..debugLog = print;
print('2. Register object');
sl.put<IDummyClass>(
(get, params) => DummyClassImpl1(params?.byName('param') ?? 'No param'),
onDispose: (instance) => instance.dispose(),
);
final params = RegistrationParams.named({'param': 'Param123'});
print('3. Resolve object');
final object = sl.get<IDummyClass>(params: params) as DummyClassImpl1;
print('4. Check the param of the resolved object: ${object.getParam()}');
print('5. Remove object');
sl.remove<IDummyClass>();
print('6. Check if still registered');
print(sl.isRegistered<IDummyClass>());
}
// Dummy classes
abstract class IDummyClass {
void dispose();
}
class DummyClassImpl1 implements IDummyClass {
final String _param;
DummyClassImpl1(this._param) {
print('Created a new instance of DummyClassImpl1.');
}
String getParam() => _param;
@override
void dispose() {
print('Object disposed');
}
}
其他特性
1. 注册模式
registry
提供了三种注册模式:
- 懒加载单例模式:首次调用
get
时创建对象。 - 立即加载单例模式:注册时立即创建对象。
- 懒加载工厂模式:每次调用
get
时都会创建新对象。
sl.put<T>(
(get, params) => YourObject(),
registrationMode: RegistrationMode.lazySingleton, // 可选值:lazySingleton, eagerSingleton, lazyFactory
);
2. 参数注入
参数可以通过两种方式传递:命名构造函数或列表构造函数。
命名构造函数
final paramsNamed = RegistrationParams.named({
'first_param': 10,
'second_param': 'Test123',
});
列表构造函数
final paramsList = RegistrationParams.list([10, 'Test123']);
3. 自动依赖解析
registry
支持多层依赖自动解析。例如:
final sl = Registry()
..put<ThirdObject>((get, params) => ThirdObject())
..put<SecondObject>((get, params) => SecondObject(get()))
..put<FirstObject>((get, params) => FirstObject(get()));
void main() {
final firstObject = sl.get<FirstObject>();
}
更多关于Flutter插件功能探索之registry插件的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复