Flutter代码生成插件kiwi_generator的使用
Flutter代码生成插件kiwi_generator的使用
kiwi_generator
是一个用于生成依赖注入代码的插件,基于 kiwi
包,可以有效减少开发时间。以下是详细的使用步骤和示例代码。
配置
1. 添加 kiwi
到 pubspec.yaml
在 dependencies:
部分添加 kiwi
:
dependencies:
kiwi: ^latest_version
2. 添加 build_runner
和 kiwi_generator
到 dev_dependencies:
在 dev_dependencies:
部分添加 build_runner
和 kiwi_generator
:
dev_dependencies:
build_runner: ^2.3.3
kiwi_generator: ^latest_version
使用
导入库
在你的库中导入 kiwi
:
import 'package:kiwi/kiwi.dart';
创建抽象类
创建一个抽象类,并定义一个抽象方法:
abstract class Injector {
void configure();
}
使用 Register
注解
在抽象方法上使用 kiwi
的 Register
注解来注册服务:
abstract class Injector {
@Register.singleton(ServiceA)
@Register.factory(Service, from: ServiceB)
@Register.factory(ServiceB, name: 'factoryB')
@Register.factory(ServiceC, resolvers: {ServiceB: 'factoryB'})
void configure();
}
添加 part
指令
指定将要生成的文件(通常与原文件相同,但扩展名为 .g.dart
):
part 'test01.g.dart';
运行 build_runner
运行以下命令生成依赖注入代码:
flutter packages pub run build_runner build --delete-conflicting-outputs
你也可以使用 watch
命令,在保存文件时自动生成:
flutter packages pub run build_runner watch
调用生成的代码
生成的代码会创建一个具体的类 _$TheNameOfYourAbstractClass
,你可以调用它:
void setup() {
var injector = _$Injector();
injector.configure();
}
或者返回具体的注入器并在其他地方使用:
Injector getInjector() => _$Injector();
注解
kiwi_generator
提供了两个构造函数:factory
和 singleton
。下面是它们的参数说明:
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
type |
Type | 是 | 要注册的类型 |
name |
String | 否 | 工厂注册的名称 |
from |
Type | 否 | 当请求 type 时创建的类型,如果不同于 type |
constructorName |
String | 否 | 在工厂中使用的构造函数名称 |
resolvers |
Map<String, String> | 否 | 对于给定的类型,提供应解析的名称 |
示例代码
以下是一个完整的示例代码:
import 'package:kiwi/kiwi.dart';
part 'test01.g.dart';
abstract class Injector {
@Register.singleton(ServiceA)
@Register.factory(Service, from: ServiceB)
@Register.factory(ServiceB, name: 'factoryB')
@Register.factory(ServiceC, resolvers: {ServiceB: 'factoryB'})
void common();
@Register.factory(ServiceC)
void development();
@Register.factory(ServiceC, constructorName: 'other')
void production();
}
class Service {}
class ServiceA extends Service {}
class ServiceB extends Service {
ServiceB(ServiceA serviceA);
}
class ServiceC extends Service {
ServiceC(ServiceA serviceA, ServiceB serviceB);
ServiceC.other(ServiceB serviceA);
}
void setup(bool isProduction) {
var injector = _$Injector();
injector.common();
if (isProduction) {
injector.production();
} else {
injector.development();
}
}
生成的代码如下:
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'test01.dart';
// **************************************************************************
// InjectorGenerator
// **************************************************************************
class _$Injector extends Injector {
void common() {
final KiwiContainer container = KiwiContainer();
container.registerSingleton((c) => ServiceA());
container.registerFactory<Service>((c) => ServiceB(c<ServiceA>()));
container.registerFactory((c) => ServiceB(c<ServiceA>()), name: 'factoryB');
container.registerFactory(
(c) => ServiceC(c<ServiceA>(), c<ServiceB>('factoryB')));
}
void development() {
final KiwiContainer container = KiwiContainer();
container.registerFactory((c) => ServiceC(c<ServiceA>(), c<ServiceB>()));
}
void production() {
final KiwiContainer container = KiwiContainer();
container.registerFactory((c) => ServiceC.other(c<ServiceB>()));
}
}
通过上述步骤,你可以轻松地在 Flutter 项目中使用 kiwi_generator
来实现依赖注入。
更多关于Flutter代码生成插件kiwi_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter代码生成插件kiwi_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中使用kiwi_generator
代码生成插件的示例。kiwi_generator
是一个依赖注入库,它通过代码生成简化了依赖注入的使用。
步骤 1: 添加依赖
首先,在你的pubspec.yaml
文件中添加kiwi
和build_runner
依赖:
dependencies:
flutter:
sdk: flutter
kiwi: ^x.y.z # 替换为最新版本号
dev_dependencies:
build_runner: ^x.y.z # 替换为最新版本号
kiwi_generator: ^x.y.z # 替换为最新版本号
然后运行flutter pub get
来安装这些依赖。
步骤 2: 创建依赖注入容器
在你的项目根目录下创建一个名为container.dart
的文件,用于定义你的依赖注入容器。
import 'package:kiwi/kiwi.dart';
part 'container.g.dart'; // 这是代码生成文件
@KiwiContainer()
class AppContainer extends _$AppContainer {
// 可以在这里定义工厂方法或构造函数来注册依赖
factory AppContainer() => _$AppContainer();
}
步骤 3: 注册依赖
假设你有一个简单的服务类MyService
,你可以像这样注册它:
// my_service.dart
class MyService {
void doSomething() {
print('Doing something!');
}
}
然后在你的container.dart
文件中注册这个服务:
// container.dart (继续上面的代码)
@register
class MyService with Singleton {
MyService() {
// 可以在这里进行初始化
}
}
步骤 4: 生成代码
在命令行中运行以下命令来生成代码:
flutter pub run build_runner build
这将在你的项目目录中生成一个container.g.dart
文件,这个文件包含了所有生成的代码。
步骤 5: 使用依赖
现在你可以在你的应用中使用依赖注入容器来获取依赖。例如,在你的主文件中:
import 'package:flutter/material.dart';
import 'container.dart';
import 'my_service.dart';
void main() {
final container = AppContainer();
runApp(MyApp(container: container));
}
class MyApp extends StatelessWidget {
final AppContainer container;
MyApp({required this.container});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Flutter with Kiwi')),
body: Center(
child: MyWidget(container: container),
),
),
);
}
}
class MyWidget extends StatelessWidget {
final AppContainer container;
MyWidget({required this.container});
@override
Widget build(BuildContext context) {
final myService = container<MyService>();
return ElevatedButton(
onPressed: () {
myService.doSomething();
},
child: Text('Press me'),
);
}
}
在这个例子中,MyWidget
通过依赖注入容器获取MyService
的实例,并在按钮点击时调用它的方法。
这就是一个基本的Flutter项目中使用kiwi_generator
的代码生成插件的示例。通过这种方式,你可以轻松地管理你的依赖项,并在整个应用中重用它们。