Flutter依赖注入插件tiny_locator的使用
Flutter依赖注入插件tiny_locator的使用
Tiny服务定位器提供了全局访问服务的入口。它可以与tiny_react结合,成为Flutter中的一个微型状态管理库。
它是一个非常小的库,少于100行代码(不包括注释),因此任何人都可以轻松理解其工作原理。
特性
- 查找服务
- 层次化作用域
正如名称所暗示的,小巧是我们的一大卖点,因此我们不计划在未来添加主要功能,但可能会添加一些只需要少量修复的功能。
开始使用
最简单的使用方式如下:
import 'package:tiny_locator/tiny_locator.dart';
void main() {
// 注册
locator.add(() => 'abc');
// 查找
print(locator.get<String>());
}
ServiceLocator
类是一个单例,对象被分配给全局变量locator
。
使用方法
以单例形式注册
立即创建并注册唯一对象。通过get
获取时将返回相同对象。
locator.add(() => Controller());
以延迟创建形式注册
对象将在使用get
获取时创建。之后,每次获取都将返回相同对象。
locator.add(() => Controller(), lazy: true);
以每次创建形式注册
每次通过get
获取时都会创建新对象。
locator.add(() => Controller(), singleton: false);
以带标签的形式注册
如果注册了相同的类,将会被覆盖。若要注册为不同实例,请添加tag
。
locator.add(() => Controller(), tag: 'abc');
查找服务
通过指定类型和tag
来查找服务。如果没有注册服务,则会抛出异常。还可以使用contains
来判断服务是否已注册。
if (locator.contains<Controller>()) {
locator.get<Controller>();
}
if (locator.contains<Controller>(tag: 'abc')) {
locator.get<Controller>(tag: 'abc');
}
删除服务
可以像get
一样删除服务。
if (locator.remove<Controller>()) {
print('deleted');
};
locator.remove<Controller>(tag: 'abc');
作用域
ServiceLocator
类以层次结构保留ServiceContainer
的实现。可以使用pop
和push
从层次结构中添加和移除ServiceContainer
,并用作作用域。主要用于与Flutter的Navigator结合使用。
// 在根作用域中注册
locator.add(() => ClassA());
// 创建新作用域
locator.push();
// 在新作用域中注册
locator.add(() => ClassB());
// 可以找到ClassA和ClassB
locator.get<ClassA>();
locator.get<ClassB>();
// 销毁当前作用域
locator.pop();
// 现在只能找到ClassA
locator.get<ClassA>();
locator.get<ClassB>(); // 异常!
tiny_react
tiny_react
是对ValueNotifier
和ValueListenableBuilder
的语法糖。与tiny_locator
结合使用时,可成为Flutter的微型状态管理方法。
import 'package:flutter/material.dart';
import 'package:tiny_locator/tiny_locator.dart';
import 'package:tiny_react/tiny_react.dart';
class MyController {
final num = 0.notif;
final list = <int>[].notif;
void doSomething() {
num.value++;
if (num.value % 2 == 0) {
list
..value.add(num.value)
..notifyListeners();
}
}
}
void main() {
locator.add(() => MyController());
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: MyPage(),
);
}
}
class MyPage extends StatelessWidget {
final controller = locator.get<MyController>();
MyPage({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('MyPage')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'You have pushed the button this many times:',
),
controller.num.build((val) => Text('$val')),
controller.list.build((val) => Text('$val')),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () => controller.doSomething(),
child: const Icon(Icons.add),
),
);
}
}
更多关于Flutter依赖注入插件tiny_locator的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter依赖注入插件tiny_locator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
tiny_locator
是一个轻量级的依赖注入(DI)库,适用于 Flutter 应用。它可以帮助你管理和注入依赖项,使你的代码更加模块化和易于测试。以下是如何在 Flutter 项目中使用 tiny_locator
的步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 tiny_locator
依赖:
dependencies:
flutter:
sdk: flutter
tiny_locator: ^1.0.0 # 请检查最新版本
然后运行 flutter pub get
来安装依赖。
2. 创建服务
假设你有一个服务类 MyService
,你希望将其注入到你的应用中:
class MyService {
void doSomething() {
print('Doing something!');
}
}
3. 注册服务
在应用的入口点(通常是 main.dart
文件),使用 tiny_locator
来注册这个服务:
import 'package:flutter/material.dart';
import 'package:tiny_locator/tiny_locator.dart';
void main() {
// 注册服务
locator.registerSingleton<MyService>(MyService());
runApp(MyApp());
}
4. 获取并使用服务
在需要使用 MyService
的地方,你可以通过 locator.get<T>()
来获取该服务:
import 'package:flutter/material.dart';
import 'package:tiny_locator/tiny_locator.dart';
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
// 获取服务
final myService = locator.get<MyService>();
return Scaffold(
appBar: AppBar(
title: Text('Tiny Locator Example'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
// 使用服务
myService.doSomething();
},
child: Text('Press Me'),
),
),
);
}
}
5. 运行应用
现在你可以运行你的应用,点击按钮时,MyService
的 doSomething
方法将会被调用。
6. 其他注册方式
tiny_locator
还支持其他注册方式,例如:
-
注册工厂:每次获取时都会创建一个新的实例:
locator.registerFactory<MyService>(() => MyService());
-
注册懒加载的单例:只有在第一次获取时才会创建实例:
locator.registerLazySingleton<MyService>(() => MyService());
7. 清除注册
如果你需要在某些情况下清除所有的注册,可以使用:
locator.reset();