Flutter模块化代码生成与更新插件modular_codegen_build_update的使用

CI

modular_codegen #

flutter_modular生成代码。实现依赖注入自动化。支持注解 InjectableParamData

安装 #

在项目的`pubspec.yaml`文件中添加`modular_codegen`和`build_runner`作为开发依赖:
dev_dependencies:
  modular_codegen: any
  build_runner: any

如果需要在Flutter 2中使用null-safety版本,请使用以下配置:

dev_dependencies:
  modular_codegen: 3.0.0-nullsafety.2
  build_runner: any

依赖注入自动化 #

通过给类添加Injectable注解来实现依赖注入自动化。别忘了添加`part`指令。
import 'package:flutter_modular/flutter_modular.dart'; // 导入用于使用Injectable注解的库

part 'home_controller.g.dart'; // 定义生成文件的路径,如your_file_name.g.dart

@Injectable() // 使用Injectable注解标记类
class HomeController {
    ...
}

在项目根目录下执行build_runner命令:

flutter pub run build_runner build

生成器会在生成的文件中提供一个以$开头的类名(如$HomeController),该类可以在模块的binds中进行注入:

class HomeModule extends Module {
  @override
  List<Bind> get binds => [
        $HomeController, // 由于类名为`HomeController`,生成的可注入类名为`$HomeController`
      ];
}

依赖注入自动化会根据构造函数的参数生成绑定。

// home_controller.dart
part 'home_controller.g.dart'; // 定义生成文件的路径

@Injectable() // 使用Injectable注解标记类
class HomeController {
    final ApiRepository repository;
    HomeController({
        this.repository, // 构造函数的参数将决定生成的绑定
    });

    ...
}

// 生成的home_controller.g.dart文件内容
Bind(i) => HomeController(
    repository: i.get<ApiRepository>(), // 来自构造函数的repository参数
);

Injectable配置 #

`Injectable`注解有两个可选布尔参数:`singleton`和`lazy`。默认情况下,它们都设置为`true`。因此,可以通过传递这些参数轻松禁用单例行为和懒加载行为。

示例:

@Injectable(singleton: false) // 禁用单例行为
class ProductController {
    ...
}

路由参数和导航参数 #

如果需要通过导航器向控制器传递数据,可以使用`Param`或`Data`注解标注构造函数的参数。

动态路由中的`Param` #

例如,如果路由URL将包含一个`id`参数,则提供一个同名的`String`参数并标注为`Param`。
part 'product_controller.g.dart'; // 定义生成文件的路径

@Injectable() // 使用Injectable注解标记类
class ProductController {
    final String id;

    ProductController({@Param this.id}); // 此注解允许在路由URL中传递`id`参数,如`/product/:id`

    ...
}

导航器参数中的`Data` #

同样地,如果需要向路由传递复杂对象,则使用`Data`注解标注构造函数的参数。
part 'product_controller.g.dart'; // 定义生成文件的路径

@Injectable() // 使用Injectable注解标记类
class ProductController {
    final ProductItem item;

    ProductController({@Data this.item}); // 添加@Data注解
    ...
}

然后,在调用Modular.to.pushNamed时传递arguments参数:

Modular.to.pushNamed('/product', arguments: ProductItem());

更多关于Flutter模块化代码生成与更新插件modular_codegen_build_update的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


modular_codegen_build_update 是一个用于 Flutter 模块化代码生成与更新的插件。它可以帮助开发者自动生成和更新模块化代码,减少手动编写重复代码的工作量。以下是如何使用 modular_codegen_build_update 插件的详细步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 modular_codegen_build_update 插件的依赖。

dependencies:
  flutter_modular: ^5.0.0  # 或者其他版本
  modular_codegen: ^1.0.0  # 或者其他版本

dev_dependencies:
  build_runner: ^2.1.0     # 或者其他版本
  modular_codegen_build_update: ^1.0.0  # 或者其他版本

2. 创建模块

在你的 Flutter 项目中,创建一个模块。例如,创建一个 app_module.dart 文件:

import 'package:flutter_modular/flutter_modular.dart';

class AppModule extends Module {
  [@override](/user/override)
  List<Bind> get binds => [];

  [@override](/user/override)
  List<ModularRoute> get routes => [];
}

3. 使用注解

在模块中使用 @Modular 注解,以便 modular_codegen_build_update 插件能够识别并生成相应的代码。

import 'package:flutter_modular/flutter_modular.dart';
import 'package:modular_codegen/modular_codegen.dart';

@Modular()
class AppModule extends Module {
  [@override](/user/override)
  List<Bind> get binds => [];

  [@override](/user/override)
  List<ModularRoute> get routes => [];
}

4. 运行代码生成器

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

flutter pub run build_runner build

或者,如果你想在代码发生变化时自动重新生成代码,可以使用:

flutter pub run build_runner watch

5. 使用生成的代码

生成的代码将会在 *.g.dart 文件中。你可以在你的项目中使用这些生成的代码来简化模块的注册和路由管理。

例如,生成的 app_module.g.dart 文件可能包含以下内容:

// GENERATED CODE - DO NOT MODIFY BY HAND

part of 'app_module.dart';

// **************************************************************************
// ModularGenerator
// **************************************************************************

class AppModule extends Module {
  [@override](/user/override)
  List<Bind> get binds => [];

  [@override](/user/override)
  List<ModularRoute> get routes => [];
}
回到顶部