Flutter注解生成插件auto_factory_annotation的使用

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

Flutter注解生成插件auto_factory_annotation的使用

通过工厂方法实现编译时依赖注入,利用了source_gen包,从而使其在每个平台上都能正常工作。此方法的优点包括性能(无需反射)和完全可调试性,因为生成的源代码易于阅读且格式良好。

安装

要使用此包,你需要在pubspec.yaml文件的dev_dependencies部分添加auto_factorybuild_runner,并在dependencies部分添加auto_factory包。

然后,运行pub run build_runner build以生成部分文件。

目录

基本用法

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

请注意,注入仅在具有位置参数的默认构造函数上有效。查看示例目录

import 'package:auto_factory_annotation/auto_factory_annotation.dart';

part 'myfile.g.dart';

// 使用@Injectable()注解标记类
@Injectable()
class Component {
  final OtherDependency dep;

  // 构造函数接受一个位置参数
  Component(OtherDependency this.dep);

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

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

component.doSomething();

单例模式

使用@Singleton()注解的效果与@Component()相同,唯一的区别在于实例仅在第一次创建时生成。之后每次调用都会返回相同的实例。

import 'package:auto_factory_annotation/auto_factory_annotation.dart';

part 'myfile.g.dart';

// 使用@Singleton()注解标记类
@Singleton()
class Component {
  final OtherDependency dep;

  // 构造函数接受一个位置参数
  Component(OtherDependency this.dep);

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

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

component.doSomething();

提供者模式

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

import 'package:auto_factory_annotation/auto_factory_annotation.dart';

part 'myfile.g.dart';

// 使用@Provider()注解标记类
@Provider()
class IpProvider extends ProviderBase<String> {

  // 实现provide方法
  @override
  FutureOr<String> provide() {
    return '127.0.0.1';
  }
}

然后,可以将注入字段标记为@ProvidedBy()注解:

import 'package:auto_factory_annotation/auto_factory_annotation.dart';

part 'myfile.g.dart';

// 使用@Component()注解标记类
@Component()
class Component {
  final String ip;

  // 构造函数接受一个位置参数
  Component(@ProvidedBy(IpProvider) String this.ip);

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

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

component.doSomething();

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

import 'package:auto_factory_annotation/auto_factory_annotation.dart';

part 'myfile.g.dart';

// 使用@Provider()注解标记类
@Provider()
class IpProvider extends ProviderBase<String> {

  // 接受一个配置对象作为依赖项
  final Config config;

  // 构造函数接受一个位置参数
  IpProvider(this.config);

  // 实现provide方法
  @override
  FutureOr<String> provide() {
    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();

  // 调用greet方法
  app.greet();
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用auto_factory_annotation插件来生成工厂方法的代码案例。auto_factory_annotation插件通常用于依赖注入场景,自动生成工厂类以简化实例的创建过程。

步骤 1: 添加依赖

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

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

dev_dependencies:
  build_runner: ^x.y.z  # 替换为最新版本号

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

步骤 2: 创建数据类和服务类

创建一个简单的数据类和一个服务类,服务类将依赖数据类。

// data_class.dart
part 'data_class.g.dart';

import 'package:auto_factory_annotation/auto_factory_annotation.dart';

@autoFactory
class DataClass {
  final String data;

  DataClass({required this.data});
}

// service_class.dart
part 'service_class.g.dart';

import 'package:auto_factory_annotation/auto_factory_annotation.dart';
import 'data_class.dart';

@autoFactory
class ServiceClass {
  final DataClass dataClass;

  ServiceClass({required this.dataClass});

  void performService() {
    print('Performing service with data: ${dataClass.data}');
  }
}

步骤 3: 生成工厂类

在你的项目根目录下运行以下命令来生成工厂类:

flutter pub run build_runner build

这将在相应的.g.dart文件中生成工厂类。

步骤 4: 使用生成的工厂类

现在你可以使用生成的工厂类来创建实例,而不需要手动编写工厂构造函数。

// main.dart
import 'package:flutter/material.dart';
import 'data_class.g.dart';
import 'service_class.g.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Auto Factory Annotation Demo'),
        ),
        body: Center(
          child: DemoWidget(),
        ),
      ),
    );
  }
}

class DemoWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 使用生成的工厂方法来创建实例
    final DataClass dataClass = createDataClass(data: 'Hello, World!');
    final ServiceClass serviceClass = createServiceClass(dataClass: dataClass);

    // 调用服务方法
    serviceClass.performService();

    return Text('Check the console for output.');
  }
}

运行应用

运行你的Flutter应用,你应该会在控制台中看到输出:

Performing service with data: Hello, World!

这个示例展示了如何使用auto_factory_annotation插件来自动生成工厂方法,从而简化依赖注入的过程。在实际项目中,你可能会将这些类和服务组织得更加复杂,但这个基本示例提供了一个良好的起点。

回到顶部