当前位置: 首页 > news >正文

Flutter代码生成:告别重复劳动,效率飙升

Flutter 中的自动生成代码是一个非常重要且能极大提升开发效率的特性。它主要通过 代码生成(Code Generation) 来实现,核心是利用 Dart 的 build_runner 工具和 注解(Annotation)。

最常用的场景包括:

  1. JSON 序列化与反序列化:将 JSON 数据自动转换为 Dart 模型类(Model Class),以及将模型类转换为 JSON。
  2. 路由生成:为命名路由自动生成路径名称和参数传递代码。
  3. 依赖注入:自动生成依赖注册和获取的代码。
  4. 生成数据类:自动生成不可变的数据类(Data Class),包含 copyWith、toString、equals 等方法。

下面我将重点介绍最常用的 JSON 序列化 和 路由生成。


  1. JSON 序列化 - json_serializable

手动编写 fromJson 和 toJson 方法非常繁琐且容易出错,json_serializable 包可以自动生成这些代码。

步骤一:添加依赖

在 pubspec.yaml 文件中添加以下依赖:

dependencies:flutter:sdk: flutterjson_annotation: ^4.8.1 # 最新版本请查阅 pub.devdev_dependencies:flutter_test:sdk: flutterflutter_lints: ^2.0.0build_runner: ^2.4.4 # 用于运行代码生成器json_serializable: ^6.7.1 # 最新版本请查阅 pub.dev

运行 flutter pub get 获取依赖。

步骤二:创建模型类并使用注解

创建一个简单的用户模型类 user.dart:

import 'package:json_annotation/json_annotation.dart';// 这个文件会自动生成,第一次运行前会报错,属于正常现象
part 'user.g.dart';// 告诉生成器这个类需要生成序列化代码
()
class User {final String name;final String email;final int? age; // 可空字段User({required this.name, required this.email, this.age});// 从JSON映射创建User实例的工厂方法// 生成的代码在 _$UserFromJson 中factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);// 将User实例转换为JSON映射// 生成的代码在 _$UserToJson 中Map<String, dynamic> toJson() => _$UserToJson(this);
}

步骤三:运行代码生成器

在项目根目录下打开终端,运行以下命令:

一次性生成:

flutter pub run build_runner build

这条命令会生成 user.g.dart 文件,之后你就可以正常使用 User.fromJson 和 toJson 方法了。

持续监听文件变化并自动生成(推荐在开发时使用):

flutter pub run build_runner watch

使用 watch 后,当你修改了 User 类(比如增加一个字段),保存文件后生成器会自动重新生成 .g.dart 文件,非常方便。

如果之前生成过,需要重新生成(遇到奇怪问题时使用):

flutter pub run build_runner build --delete-conflicting-outputs

–delete-conflicting-outputs 参数会强制删除之前生成的文件并重新生成,解决大部分冲突问题。

最终生成的文件 (user.g.dart):

这个文件是自动生成的,不要手动编辑它。

// GENERATED CODE - DO NOT MODIFY BY HANDpart of 'user.dart';// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************User _$UserFromJson(Map<String, dynamic> json) => User(name: json['name'] as String,email: json['email'] as String,age: json['age'] as int?,);Map<String, dynamic> _$UserToJson(User instance) => <String, dynamic>{'name': instance.name,'email': instance.email,'age': instance.age,};

  1. 路由生成 - go_router 或 auto_route

对于大型项目,管理命名路由是一个挑战。这两个包可以帮你自动生成路由相关的代码。

这里以功能强大且流行的 go_router (官方推荐) 为例,它本身通过基于字符串的路由表工作,不需要代码生成,但能很好地管理路由。

如果你需要类型安全、参数自动注入等更高级的功能,可以看 auto_route。

使用 go_router (无需代码生成,但智能管理)

  1. 添加依赖:
    dependencies:go_router: ^11.0.0
    
  2. 配置路由:
    import 'package:go_router/go_router.dart';final GoRouter router = GoRouter(routes: <RouteBase>[GoRoute(path: '/',builder: (BuildContext context, GoRouterState state) => const HomePage(),),GoRoute(path: '/details/:id', // 使用参数 idbuilder: (BuildContext context, GoRouterState state) {// 从 state.params 中获取参数final String id = state.pathParameters['id']!;return DetailsPage(id: id);},),],
    );// 在 MaterialApp 中使用
    MaterialApp.router(routerConfig: router,...
    )
    
  3. 导航:
    // 跳转到详情页
    context.go('/details/123');
    

go_router 通过智能解析路径来自动处理参数,无需生成代码。

使用 auto_route (需要代码生成)

如果你更喜欢基于注解的、类型安全的路由,auto_route 是更好的选择。它的使用方式和 json_serializable 非常相似。

  1. 添加依赖 (pubspec.yaml):
    dependencies:auto_route: ^7.0.0
    dev_dependencies:build_runner: ^2.4.4auto_route_generator: ^7.0.0
    
  2. 使用注解创建路由 (router.dart):
    import 'package:auto_route/auto_route.dart';
    import 'package:flutter/material.dart';part 'router.gr.dart'; // 将会生成的文件()
    class AppRouter extends $AppRouter {List<AutoRoute> get routes => [AutoRoute(page: HomeRoute.page, initial: true),AutoRoute(page: DetailsRoute.page),];
    }()
    class HomePage extends StatelessWidget { ... }()
    class DetailsPage extends StatelessWidget {final String id;DetailsPage({required this.id});
    }
    
  3. 运行生成器:
    flutter pub run build_runner watch
    
    它会生成 router.gr.dart 文件,其中包含了 HomeRoute、DetailsRoute 等类以及路径配置。
  4. 导航 (类型安全):
    // 不再需要传递字符串路径
    context.pushRoute(DetailsRoute(id: '123'));
    

总结

场景 推荐包 命令 优点
JSON 序列化 json_serializable build_runner build 避免手写错误,节省时间
路由管理 go_router 无 官方推荐,配置简单,功能强大
类型安全路由 auto_route build_runner build 类型安全,参数自动注入

核心流程:

  1. 在 pubspec.yaml 中添加依赖(包括 build_runner 这样的开发依赖)。
  2. 在你的 Dart 代码中使用特定的注解(如 @JsonSerializable, @RoutePage)。
  3. 在终端运行 flutter pub run build_runner build 或 watch 命令。
  4. 使用生成的代码(.g.dart 或 .gr.dart 文件)。

学会使用代码生成可以让你从大量重复、易错的代码中解放出来,专注于业务逻辑,是 Flutter 开发者必备的技能。


文章转载自:

http://FT92Sp2S.yLtyr.cn
http://4PPy8XnV.yLtyr.cn
http://muXBFNry.yLtyr.cn
http://m6be6SLs.yLtyr.cn
http://P6cbcXwq.yLtyr.cn
http://nR2DJgVT.yLtyr.cn
http://v9B3QvAP.yLtyr.cn
http://ILyogNhs.yLtyr.cn
http://hsJsUlO2.yLtyr.cn
http://pBTWbPUi.yLtyr.cn
http://mm8BGR9g.yLtyr.cn
http://ikH9Aw1S.yLtyr.cn
http://ZCv71jLX.yLtyr.cn
http://LijRGNz0.yLtyr.cn
http://5UeRYJ39.yLtyr.cn
http://X9zths6L.yLtyr.cn
http://hkkh763B.yLtyr.cn
http://PrIBJfRM.yLtyr.cn
http://X5qvv38a.yLtyr.cn
http://bx5OhV2C.yLtyr.cn
http://fI9U5snW.yLtyr.cn
http://XbBJwzLC.yLtyr.cn
http://sGcrkkrs.yLtyr.cn
http://BTRbZ5Lq.yLtyr.cn
http://JSnU1oOw.yLtyr.cn
http://CdWbDHOx.yLtyr.cn
http://8HqG3QHW.yLtyr.cn
http://SwPv2KUC.yLtyr.cn
http://0GOMphlv.yLtyr.cn
http://ZJUfKrBx.yLtyr.cn
http://www.dtcms.com/a/364996.html

相关文章:

  • 51单片机-LED与数码管模块
  • OpenHarmony Ability“全家桶”彻底拆解:从UIAbility到ExtensionAbility一文说清楚
  • 学习嵌入式的第三十二天——网络编程——TCP
  • 【机器学习学习笔记】逻辑回归实现与应用
  • 爬取m3u8视频完整教程
  • GitHub 上那些值得收藏的英文书籍推荐(计算机 非计算机类)
  • 一键掌握服务器健康状态与安全风险
  • 前端视角下的 Web 安全攻防:XSS、CSRF、DDoS 一次看懂
  • 02、连接服务器的几种方式
  • 企业文档安全守护者全面测评:7款加密软件深度解析,让商业机密固若金汤
  • JVM分析(OOM、死锁、死循环)(JProfiler、arthas、jvm自带工具)
  • 股指期货可以通过移仓长线持有吗?
  • 基于springboot的在线答题练习系统
  • 【正则表达式】 正则表达式的元字符是什么?正则表达式的元字符有什么作用?
  • 微软rStar2-Agent:新的GRPO-RoC算法让14B模型在复杂推理时超越了前沿大模型
  • DAO LLC:怀俄明州首个承认去中心化自治组织法人化的新里程碑
  • Android Looper源码阅读
  • 手搓一个企业级Agent智能体
  • PyTorch 面试题及详细答案120题(116-120)-- 综合应用与实践
  • 英语四级学习指南
  • 《单链表学习手册:从原理到代码实现(含头插 / 尾插 / 销毁)》
  • go-mapus为局域网地图协作而生
  • 充电枪结构-常规特征设计
  • 小程序点击之数据绑定
  • 【数学建模学习笔记】相关性分析
  • Git在idea中的实战使用经验(二)
  • Elasticsearch 数字字段随机取多值查询缓慢-原理分析与优化方案
  • 408考研——单链表代码题常见套路总结
  • [光学原理与应用-375]:ZEMAX - 分析 - 物理光学图
  • Debezium报错处理系列之第130篇:OutOfMemoryError: Java heap space