Flutter自动化工厂插件auto_factory的使用

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

Flutter自动化工厂插件auto_factory的使用

安装

要使用此包,请在 pubspec.yaml 文件的 dev_dependencies 部分添加 auto_factorybuild_runner,并在 dependencies 部分添加 auto_factory_annotation 包。然后运行 pub run build_runner build 来生成部分文件。

dev_dependencies:
  auto_factory:
  build_runner:

dependencies:
  auto_factory_annotation:

目录

基本用法

为了使类成为依赖注入树的一部分,请使用 @Injectable() 注解标记该类。库通过创建新实例并将其所需依赖注入到默认构造函数中来满足依赖关系。

注意,仅在具有位置参数的默认构造函数中才会生效。参见示例目录。

import 'package:auto_factory_annotation/auto_factory_annotation.dart';

part 'myfile.g.dart';

@Injectable()
class Component {
  final OtherDependency dep;

  Component(OtherDependency this.dep);

  void doSomething() {
    //...
  }
}

/// 在另一个文件中:
final component = await ComponentFactory().create();

component.doSomething();

单例

使用 @Singleton() 注解的效果与 @Component() 注解相同,只是实例只会在第一次创建。之后每次都会返回相同的实例。

import 'package:auto_factory_annotation/auto_factory_annotation.dart';

part 'myfile.g.dart';

@Singleton()
class Component {
  final OtherDependency dep;

  Component(OtherDependency this.dep);

  void doSomething() {
    //...
  }
}

/// 在另一个文件中:
final component = await ComponentFactory().create();

component.doSomething();

提供者

有时你无法访问导入的对象,因此不能对其进行注解以使其成为依赖图的一部分。在这种情况下,你可以创建一个带有 @Provider() 注解并扩展 @ProviderBase 的类,并实现 provide() 方法。

import 'package:auto_factory_annotation/auto_factory_annotation.dart';

part 'myfile.g.dart';

@Provider()
class IpProvider extends ProviderBase<String> {

  @override
  Future<String> provide() async {
    return '127.0.0.1';
  }
}

然后,使用 @ProvidedBy() 注解标记注入字段:

import 'package:auto_factory_annotation/auto_factory_annotation.dart';

part 'myfile.g.dart';

@Component()
class Component {
  final String ip;

  Component(@ProvidedBy(IpProvider) String this.ip);

  void doSomething() {
    //...
  }
}

/// 在另一个文件中:
final component = await ComponentFactory().create();

component.doSomething();

提供者也可以通过组件和其他提供者解析其依赖项:

import 'package:auto_factory_annotation/auto_factory_annotation.dart';

part 'myfile.g.dart';

@Provider()
class IpProvider extends ProviderBase<String> {

  final Config config;

  IpProvider(this.config);

  @override
  Future<String> provide() async {
    return this.config ? '127.0.0.1' : '11.22.33.44';
  }
}

示例

auto_factory/example 目录包含一个完整的示例。

示例代码

import 'lib/src/application.dart';

void main() async {
  final app = await ApplicationFactory().create();

  app.greet();
}

更多关于Flutter自动化工厂插件auto_factory的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自动化工厂插件auto_factory的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter开发中,auto_factory 插件是一个非常有用的工具,它可以帮助你自动生成工厂构造函数,简化对象的创建过程。下面是一个关于如何使用 auto_factory 插件的代码示例。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 auto_factory 依赖:

dependencies:
  flutter:
    sdk: flutter
  auto_factory: ^x.y.z  # 请替换为最新版本号

然后运行 flutter pub get 来获取依赖。

2. 定义数据模型

假设我们有一个简单的数据模型 User,我们希望为它生成一个工厂构造函数。

import 'package:auto_factory/auto_factory.dart';

part 'user.auto_factory.g.dart';  // 生成的工厂代码将会放在这个文件里

@autoFactory
class User {
  final String name;
  final int age;

  User({required this.name, required this.age});
}

3. 生成工厂代码

运行以下命令来生成工厂代码:

flutter pub run build_runner build

这将会生成一个 user.auto_factory.g.dart 文件,其中包含 User 类的工厂构造函数。

4. 使用生成的工厂构造函数

现在你可以使用生成的工厂构造函数来创建 User 对象了。

void main() {
  // 使用生成的工厂构造函数创建 User 对象
  User user = UserFactory().create(name: 'Alice', age: 30);

  print('Name: ${user.name}, Age: ${user.age}');
}

5. 完整示例

以下是完整的代码示例,包括数据模型定义、生成工厂代码以及使用工厂构造函数:

user.dart

import 'package:auto_factory/auto_factory.dart';

part 'user.auto_factory.g.dart';

@autoFactory
class User {
  final String name;
  final int age;

  User({required this.name, required this.age});
}

main.dart

import 'user.dart';

void main() {
  // 使用生成的工厂构造函数创建 User 对象
  User user = UserFactory().create(name: 'Alice', age: 30);

  print('Name: ${user.name}, Age: ${user.age}');
}

运行生成命令

在命令行中运行以下命令来生成工厂代码:

flutter pub run build_runner build

然后运行你的 Flutter 应用:

flutter run

你应该会看到输出:

Name: Alice, Age: 30

这样,你就成功地使用了 auto_factory 插件来自动生成工厂构造函数并简化了对象的创建过程。

回到顶部