Flutter自动生成代码插件depi_generator的使用

Flutter自动生成代码插件depi_generator的使用

depi_generator 是一个用于自动生成代码的库,适用于 depi 框架。通过该插件,可以简化代码生成过程,提高开发效率。

安装与配置

首先,在你的 pubspec.yaml 文件中添加 depi_generator 依赖:

dependencies:
  flutter:
    sdk: flutter

dev_dependencies:
  depi_generator:

接下来,确保在 build.yaml 中配置生成器:

targets:
  $default:
    sources:
      - lib/**
builders:
  depi_generator:
    import: "package:depi_generator/depi_generator.dart"
    builder_factories: ["depiGeneratorBuilderFactory"]
    build_extensions: {".dart": [".depi.dart"]}
    auto_apply: dependents
    build_to: source

示例代码

以下是一个简单的示例,展示如何使用 depi_generator 自动生成代码。

1. 创建服务接口

首先,创建一个抽象服务接口:

// services/abstract_service.dart
abstract class AbstractService {
  void doSomething();
}

2. 实现服务类

然后,实现该接口:

// services/my_service.dart
import 'abstract_service.dart';

class MyService implements AbstractService {
  @override
  void doSomething() {
    print("Doing something...");
  }
}

3. 配置服务集合

接下来,创建一个服务集合类来管理服务实例:

// service_collection/service_collection.dart
import 'package:depi_generator/depi_generator.dart';

class MyServiceCollection {
  final List<ServiceProvider> _providers = [];

  static MyServiceCollection production() {
    return MyServiceCollection();
  }

  ServiceProvider&lt;T&gt; register&lt;T extends Object&gt;(T instance) {
    _providers.add(ServiceProvider(instance));
    return ServiceProvider(instance);
  }

  T? service&lt;T extends Object&gt;() {
    return _providers.firstWhere(
      (provider) => provider is ServiceProvider&lt;T&gt;,
      orElse: () =&gt; null,
    )?.instance as T?;
  }
}

class ServiceProvider&lt;T&gt; {
  final T instance;

  ServiceProvider(this.instance);

  T get instance =&gt; instance;
}

4. 使用服务

最后,编写主函数来使用服务:

// example/main.dart
import 'service_collection/service_collection.dart';
import 'services/abstract_service.dart';

void main() {
  final serviceProvider = MyServiceCollection.production()
    ..register(MyService());

  final service = serviceProvider.service&lt;AbstractService&gt;();

  if (service != null) {
    service.doSomething(); // 输出 "Doing something..."
  } else {
    print("Service not found.");
  }
}

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

1 回复

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


depi_generator 是一个用于 Flutter 的代码生成插件,它可以帮助开发者自动生成依赖注入(Dependency Injection, DI)相关的代码。通过使用 depi_generator,开发者可以减少手动编写依赖注入代码的工作量,提高开发效率。

安装 depi_generator

首先,你需要在 pubspec.yaml 文件中添加 depi_generatorbuild_runner 作为开发依赖项:

dev_dependencies:
  build_runner: ^2.1.0
  depi_generator: ^0.0.1

然后运行 flutter pub get 来安装依赖。

使用 depi_generator

  1. 定义依赖注入的类

    假设你有一个 UserService 类,你希望将它注入到其他类中:

    // user_service.dart
    class UserService {
      String getUserName() => "John Doe";
    }
    
  2. 使用 [@Injectable](/user/Injectable) 注解

    UserService 类上使用 [@Injectable](/user/Injectable) 注解,表示这个类可以被注入:

    import 'package:depi/depi.dart';
    
    [@Injectable](/user/Injectable)()
    class UserService {
      String getUserName() => "John Doe";
    }
    
  3. 生成代码

    使用 build_runner 来生成依赖注入的代码。在终端中运行以下命令:

    flutter pub run build_runner build
    

    这将会生成一个 *.g.dart 文件,其中包含了自动生成的依赖注入代码。

  4. 使用生成的代码

    在需要注入 UserService 的地方,你可以直接使用生成的代码:

    import 'package:depi/depi.dart';
    import 'user_service.dart';
    import 'user_service.g.dart'; // 生成的代码
    
    void main() {
      // 初始化依赖注入
      setupDependencies();
    
      // 获取 UserService 实例
      final userService = getIt<UserService>();
    
      print(userService.getUserName()); // 输出: John Doe
    }
    

高级用法

depi_generator 还支持更复杂的依赖注入场景,例如:

  • 单例模式:通过 @Singleton() 注解可以将类标记为单例。
  • 命名依赖:通过 [@Named](/user/Named)() 注解可以为同一类型的依赖提供不同的实例。
  • 模块化依赖注入:可以将依赖注入的配置模块化,方便管理和维护。

示例:单例模式

@Singleton()
class UserService {
  String getUserName() => "John Doe";
}

示例:命名依赖

[@Injectable](/user/Injectable)()
[@Named](/user/Named)("admin")
class AdminService {
  String getAdminName() => "Admin User";
}

[@Injectable](/user/Injectable)()
[@Named](/user/Named)("user")
class UserService {
  String getUserName() => "John Doe";
}

// 使用命名依赖
final adminService = getIt<AdminService>(instanceName: "admin");
final userService = getIt<UserService>(instanceName: "user");
回到顶部