Flutter数据类生成插件mek_data_class_generator的使用

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

Flutter数据类生成插件mek_data_class_generator的使用

插件简介

mek_data_class_generator 是一个用于生成Flutter数据类的插件,它能够自动生成常用的方法,如 hashCode==toStringcopyWith 等,从而减少样板代码的编写。该插件支持继承、泛型类,并且可以根据需要启用或禁用特定的功能。

功能特性

  • 继承和泛型类支持:可以生成继承类和泛型类。
  • 自动生成 hashCode== 方法:确保对象的比较和哈希值计算正确。
  • 自动生成 toString 方法:生成格式良好的字符串表示。
  • 自动生成 copyWith 方法:方便地复制对象并修改部分字段。
  • 生成 *Changes 类和 changetoChanges 方法:支持可空性处理。
  • 生成 *Builder:用于构建复杂对象。
  • 生成字段类:包含数据类的字段名称,便于反射使用。

安装步骤

  1. pubspec.yaml 文件中添加依赖

    # pubspec.yaml
    dependencies:
      mek_data_class:
    
    dev_dependencies:
      build_runner:
      mek_data_class_generator:
    
  2. 运行代码生成器: 使用以下命令运行代码生成器:

    dart pub run build_runner build
    
  3. 在 Dart 文件中导入生成的代码

    import 'package:mek_data_class/mek_data_class.dart';
    
    part 'my_file.g.dart';
    

使用示例

1. 基本用法
import 'package:mek_data_class/mek_data_class.dart';

part 'basic_example.g.dart';

@DataClass()
class Product with _$Product {
  final String title;
  @DataField(equality: DefaultEquality())
  final double price;

  const Product({
    required this.title,
    required this.price,
  });

  // 自定义 getter
  String get titlePrice => '$title $price';
}
  • 说明@DataClass() 注解会自动为 Product 类生成 hashCode==toStringcopyWith 方法。@DataField 注解用于自定义字段的相等性和哈希值计算规则。
2. 继承
import 'package:mek_data_class/mek_data_class.dart';

part 'inheritance_example.g.dart';

@DataClass()
class Product with _$Product {
  final String title;
  @DataField(equality: DefaultEquality())
  final double price;

  const Product({
    required this.title,
    required this.price,
  });
}

@DataClass()
class PrettyProduct extends Product with _$PrettyProduct {
  final String color;

  const PrettyProduct({
    required String title,
    required double price,
    required this.color,
  }) : super(title: title, price: price);

  // 自定义 getter
  String get titlePriceColor => '$titlePrice $color';
}
  • 说明PrettyProduct 继承了 Product 类,并且自动生成了所有父类的方法。
3. 泛型类
import 'package:mek_data_class/mek_data_class.dart';

part 'generics_example.g.dart';

@DataClass()
class Value<T> with _$Value<T> {
  final T value;

  const Value({
    required this.value,
  });
}
  • 说明Value 类是一个泛型类,mek_data_class_generator 会为泛型类生成相应的代码。
4. 格式化的 toString 方法
final product = Product(title: 'Overlord', price: 12);
print(product);
// 输出:
// Product(
//   title=Overlord,
//   price=12,
// )
  • 说明toString 方法会自动生成格式良好的字符串表示。
5. copyWith 方法
final product = Product(title: 'Overlord', price: 12);
final updatedProduct = product.copyWith(title: 'Raisekamika');
print(updatedProduct);
// 输出:
// Product(
//   title=Raisekamika,
//   price=12,
// )
  • 说明copyWith 方法允许你复制对象并修改部分字段。
6. *Changes
final product = Product(title: 'Overlord', price: 12);
final updatedProduct = product.change((changes) => changes..title = 'Raisekamika');

// 或者
final changes = product.toChanges();
changes.title = 'Raisekamika';
final updatedProduct = changes.build();
  • 说明*Changes 类允许你安全地更新对象的字段,支持可空性处理。
7. *Builder
@DataClass(buildable: true)
class Product with _$Product {
  final int id;

  const Product({required this.id});

  factory Product.build(void Function(ProductBuilder b) updates) =>
      (ProductBuilder().update(updates)).build();
}

final builder = ProductBuilder();
builder.id = 12;
final product = builder.build();
  • 说明*Builder 类允许你逐步构建对象,适用于复杂的对象构造。
8. 生成字段类
@DataClass(createFieldsClass: true)
class Product with _$Product {
  final int id;

  const Product({required this.id});
}

// 生成的字段类
class ProductFields {
  final String _path;
  const ProductFields([this._path = '']);
  String get id => '${_path}id';
}
  • 说明createFieldsClass 选项会生成一个包含字段名称的类,便于反射使用。

全局配置

你可以在 build.yaml 文件中配置全局选项,以控制生成的行为。例如:

targets:
  $default:
    builders:
      mek_data_class_generator:
        enabled: true
        options:
          comparable: true
          stringify: true
          changeable: true

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

1 回复

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


当然,下面是一个关于如何使用Flutter数据类生成插件mek_data_class_generator的示例。这个插件可以帮助你快速从JSON数据生成Dart数据类。

首先,确保你已经在pubspec.yaml文件中添加了mek_data_class_generator依赖:

dependencies:
  flutter:
    sdk: flutter
  # 其他依赖项...

dev_dependencies:
  build_runner: ^2.1.4
  mek_data_class_generator: ^最新版本号 # 请替换为当前最新版本号

然后,你需要一个JSON文件作为数据源。例如,假设你有一个名为example.json的文件,内容如下:

{
  "name": "John Doe",
  "age": 30,
  "email": "john.doe@example.com"
}

接下来,在你的Flutter项目中创建一个Dart文件,例如data_models.dart,在这个文件中使用mek_data_class_generator生成数据类。

// data_models.dart
import 'package:json_annotation/json_annotation.dart';
part 'data_models.g.dart'; // 这行很重要,告诉生成器输出文件的位置

@JsonSerializable()
class User {
  final String name;
  final int age;
  final String email;

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

  // 从JSON生成User对象
  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);

  // 将User对象转换为JSON
  Map<String, dynamic> toJson() => _$UserToJson(this);
}

注意,上面的代码包含了一个part指令,它指向一个生成的文件data_models.g.dart。这个文件将由mek_data_class_generator插件自动生成,包含fromJsontoJson方法的实现。

然后,在项目根目录下运行以下命令来生成data_models.g.dart文件:

flutter pub run build_runner build

如果一切正常,你应该会在项目目录中看到一个新生成的data_models.g.dart文件,其中包含了User类的fromJsontoJson方法的实现。

现在,你可以在你的Flutter应用中使用这个数据类了。例如,从网络获取JSON数据并解析为User对象:

import 'dart:convert';
import 'package:flutter/material.dart';
import 'data_models.dart'; // 导入生成的数据类

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Flutter Data Class Generator Demo')),
        body: Center(
          child: FutureBuilder<User>(
            future: fetchUser(),
            builder: (context, snapshot) {
              if (snapshot.connectionState == ConnectionState.done) {
                if (snapshot.hasError) {
                  return Text('Error: ${snapshot.error}');
                } else {
                  User user = snapshot.data!;
                  return Text('Name: ${user.name}\nAge: ${user.age}\nEmail: ${user.email}');
                }
              } else {
                return CircularProgressIndicator();
              }
            },
          ),
        ),
      ),
    );
  }

  Future<User> fetchUser() async {
    // 假设你有一个API返回上面的JSON数据
    final response = await http.get(Uri.parse('https://api.example.com/user'));

    if (response.statusCode == 200) {
      // 解析JSON数据为User对象
      Map<String, dynamic> jsonData = jsonDecode(response.body);
      return User.fromJson(jsonData);
    } else {
      throw Exception('Failed to load user');
    }
  }
}

请注意,上面的示例代码中使用了http包来获取网络数据,因此你需要在pubspec.yaml中添加http依赖:

dependencies:
  flutter:
    sdk: flutter
  http: ^0.13.3 # 请替换为当前最新版本号
  # 其他依赖项...

这样,你就完成了使用mek_data_class_generator插件从JSON数据生成Dart数据类的整个过程。

回到顶部