Flutter代码生成插件kiwi_generator的使用

发布于 1周前 作者 phonegap100 来自 Flutter

Flutter代码生成插件kiwi_generator的使用

kiwi_generator 是一个用于生成依赖注入代码的插件,基于 kiwi 包,可以有效减少开发时间。以下是详细的使用步骤和示例代码。

配置

1. 添加 kiwipubspec.yaml

dependencies: 部分添加 kiwi

dependencies:
  kiwi: ^latest_version

2. 添加 build_runnerkiwi_generatordev_dependencies:

dev_dependencies: 部分添加 build_runnerkiwi_generator

dev_dependencies:  
  build_runner: ^2.3.3
  kiwi_generator: ^latest_version

使用

导入库

在你的库中导入 kiwi

import 'package:kiwi/kiwi.dart';

创建抽象类

创建一个抽象类,并定义一个抽象方法:

abstract class Injector {
  void configure();
}

使用 Register 注解

在抽象方法上使用 kiwiRegister 注解来注册服务:

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 提供了两个构造函数:factorysingleton。下面是它们的参数说明:

参数 类型 是否必需 描述
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

1 回复

更多关于Flutter代码生成插件kiwi_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用kiwi_generator代码生成插件的示例。kiwi_generator是一个依赖注入库,它通过代码生成简化了依赖注入的使用。

步骤 1: 添加依赖

首先,在你的pubspec.yaml文件中添加kiwibuild_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的代码生成插件的示例。通过这种方式,你可以轻松地管理你的依赖项,并在整个应用中重用它们。

回到顶部