Flutter依赖注入插件angel3_container_generator的使用

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

Flutter依赖注入插件angel3_container_generator的使用

Pub Version (包括预发布版本) 空安全 Gitter 许可证

Angel3 Container Generator 是一个用于 Angel3 的替代容器,它使用 reflectable 包来代替 dart:mirrors 进行反射。然而,与 dart:mirrors 相比,reflectable 提供的反射能力更为有限。

使用

以下是使用 Angel3 Container Generator 的步骤:

  1. 标注类:使用 @contained 注解标记要包含的类。
  2. 运行构建器:运行 dart run build_runner build <你的类目录>
  3. 创建 build.xml 文件(可选):
    targets:
      $default:
        builders:
          reflectable:
            generate_for:
            - bin/**_controller.dart
            options:
              formatted: true
    

已知限制

  • 由于 reflectable 的原因,不支持 analyser 6.x。
  • 不支持对函数/闭包进行反射。
  • 不支持对私有声明进行反射。
  • 不支持对泛型类型进行反射。

完整示例

以下是一个完整的示例,展示了如何使用 angel3_container_generator 插件。

import 'dart:async';

import 'package:angel3_container/angel3_container.dart';
import 'package:angel3_container_generator/angel3_container_generator.dart';

Future<void> main() async {
  // 创建一个容器实例。
  Container container = Container(GeneratedReflector());

  // 注册一个单例。
  container.registerSingleton<Engine>(Engine(40));

  // 您也可以省略类型注解,在这种情况下将使用对象的实际运行时类型。
  // 如果您正在注入抽象类,请优先使用类型注解。
  //
  // container.registerSingleton(Engine(40));

  // 注册一个工厂方法,用于创建卡车。
  container.registerFactory<Truck>((container) {
    return _TruckImpl(container.make<Engine>());
  });

  // 使用 `make` 方法创建实例。
  var truck = container.make<Truck>();

  // 您还可以异步解析注入。
  container.registerFactory<Future<int>>((_) async => 24);
  print(await container.makeAsync<int>());

  // 异步解析也适用于普通对象。
  await container.makeAsync<Truck>().then((t) => t.drive());

  // 注册一个命名的单例。
  container.registerNamedSingleton('the_truck', truck);

  // 应该打印:'Vroom! 我的引擎有40马力。'
  truck.drive();

  // 应该打印相同的内容。
  container.findByName<Truck>('the_truck').drive();

  // 我们可以创建一个具有自己工厂方法的子容器。
  var childContainer = container.createChild();

  childContainer.registerFactory<Truck>((container) {
    return _TruckImpl(Engine(5666));
  });

  // 创建一个拥有5666马力的卡车。
  childContainer.make<Truck>().drive();

  // 然而,调用 `make<Engine>` 将返回我们之前创建的单例引擎。
  print(childContainer.make<Engine>().horsePower);
}

// 抽象类
abstract class Truck {
  void drive();
}

// 发动机类
class Engine {
  final int horsePower;

  Engine(this.horsePower);
}

// 卡车实现类
class _TruckImpl implements Truck {
  final Engine engine;

  _TruckImpl(this.engine);

  [@override](/user/override)
  void drive() {
    print('Vroom! 我的引擎有${engine.horsePower}马力。');
  }
}

更多关于Flutter依赖注入插件angel3_container_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter依赖注入插件angel3_container_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用angel3_container_generator进行依赖注入的示例代码。angel3_container_generator 是一个用于生成依赖注入容器的 Dart 包,特别适用于 Flutter 和 Dart 的服务器端应用。

首先,确保你的 pubspec.yaml 文件中包含了 angel3_containerbuild_runner 的依赖:

dependencies:
  flutter:
    sdk: flutter
  angel3_container: ^4.0.0 # 请检查最新版本号

dev_dependencies:
  build_runner: ^2.0.0 # 请检查最新版本号
  angel3_container_generator: ^4.0.0 # 请检查最新版本号

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

接下来,我们创建一个简单的服务和一个容器配置类。

1. 创建一个服务类

例如,我们创建一个简单的 UserService 类:

// user_service.dart
class UserService {
  String getGreeting() {
    return 'Hello, User!';
  }
}

2. 创建容器配置类

使用 angel3_container_generator 注解来标记需要注入的依赖项:

// container_config.dart
import 'package:angel3_container/angel3_container.dart';
import 'package:angel3_container_generator/angel3_container_generator.dart';
import 'user_service.dart';

part 'container_config.g.dart';

@GenerateContainer()
class MyContainerConfig extends ContainerConfigurer {
  @override
  void configure(Container container) {
    container.singleton<UserService>(UserService());
  }
}

3. 生成配置代码

在项目根目录下运行以下命令来生成配置代码:

flutter pub run build_runner build

这将生成一个 container_config.g.dart 文件,该文件包含了容器的配置实现。

4. 使用生成的容器

现在,你可以在应用的任何地方使用生成的容器来获取依赖项。例如,在一个 Flutter 小部件中:

// main.dart
import 'package:flutter/material.dart';
import 'package:your_project_name/container_config.g.dart'; // 导入生成的配置文件
import 'user_service.dart';

void main() {
  // 获取生成的容器实例
  final container = $MyContainerConfig();

  runApp(MyApp(container: container));
}

class MyApp extends StatelessWidget {
  final Container container;

  MyApp({required this.container});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Dependency Injection Example'),
        ),
        body: Center(
          child: Text(
            // 从容器中获取 UserService 实例并调用其方法
            container.make<UserService>().getGreeting(),
            style: TextStyle(fontSize: 24),
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们首先通过 $MyContainerConfig() 获取生成的容器实例,然后在 MyApp 小部件中使用这个容器来获取 UserService 的实例,并调用其 getGreeting 方法。

这就是如何在 Flutter 项目中使用 angel3_container_generator 进行依赖注入的一个简单示例。通过这种方式,你可以轻松管理和注入应用中的依赖项。

回到顶部