Flutter依赖注入插件angel3_container_generator的使用
Flutter依赖注入插件angel3_container_generator的使用
Angel3 Container Generator 是一个用于 Angel3 的替代容器,它使用 reflectable
包来代替 dart:mirrors
进行反射。然而,与 dart:mirrors
相比,reflectable
提供的反射能力更为有限。
使用
以下是使用 Angel3 Container Generator 的步骤:
- 标注类:使用
@contained
注解标记要包含的类。 - 运行构建器:运行
dart run build_runner build <你的类目录>
。 - 创建 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
更多关于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_container
和 build_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
进行依赖注入的一个简单示例。通过这种方式,你可以轻松管理和注入应用中的依赖项。