Flutter数据管理类插件mek_data_class的使用

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

Flutter数据管理类插件mek_data_class的使用

简介

mek_data_class 是一个用于简化 Dart 类方法生成的库,旨在提供高性能和少量代码生成。它支持继承、泛型类、hashCode== 方法、美观的 toString 方法、copyWith 方法以及变化(Changes)类和构建器(Builder)类等特性。

功能特性

  • ✅ 支持继承和泛型类
  • ✅ 自动生成 hashCode== 方法
  • ✅ 生成美观的 toString 方法
  • ✅ 自动生成 copyWith 方法
  • ✅ 自动生成变化(Changes)类及 changetoChanges 方法
  • ✅ 自动生成构建器(Builder)类以构建类实例

安装包

要使用 mek_data_class,你需要按照以下步骤设置 build_runner 和代码生成器:

在 pubspec.yaml 中添加依赖项

# pubspec.yaml
dependencies:
  mek_data_class:

dev_dependencies:
  build_runner:
  mek_data_class_generator:

运行代码生成器

使用以下命令运行代码生成器:

dart pub run build_runner build

使用示例

基本用法

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,
  });

  String get titlePrice => '$title$price';
}

继承

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,
  });

  String get titlePrice => '$title$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);

  String get titlePriceColor => '$titlePrice$color';
}

泛型

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,
  });
}

漂亮的字符串表示

final product = Product(title: 'Overlord', price: 12);
print(product);
// 输出: Product(
//   title=Overlord,
//   price=12,
// )

copyWith 方法

final product = Product(title: 'Overlord', price: 12);
print(product.copyWith(title: 'Raisekamika'));
// 输出: Product(
//   title=Raisekamika,
//   price=12,
// )

Changes 类

final updatedProduct = product.change((changes) => changes..title = 'Raisekamika');

final changes = product.toChanges();
changes.title = 'Raisekamika';
final updatedProduct = changes.build();

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();

DataClassFields 类

@DataClass(createFieldsClass: true)
class Product with _$Product {
  final int id;
  const Product({required this.id});
}

// GENERATED CODE
class ProductFields {
  final String _path;
  const ProductFields([this._path = '']);
  String get id => '${_path}id';
}

全局配置

你可以在 build.yaml 文件中配置全局选项:

# build.yaml
targets:
  $default:
    builders:
      mek_data_class_generator:data_class:
        enabled: true
        options:
          page_width: 80
          comparable: true
          stringify: true
          stringify_type: params | fields
          stringify_if_null: true
          buildable: false
          copyable: false
          changeable: false
          changes_visible: false
          create_fields_class: false
          fields_class_visible: true

推荐配置:

comparable: true
stringify: true
changeable: true

通过这些配置,你可以根据需要启用或禁用特定的功能。

总结

mek_data_class 提供了一种简洁且高效的方式来管理和生成 Dart 数据类。通过其丰富的功能和灵活的配置选项,可以帮助开发者减少样板代码并提高开发效率。希望这个指南能帮助你在项目中更好地使用 mek_data_class。


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

1 回复

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


当然,以下是如何在Flutter项目中使用mek_data_class插件来管理数据的一个简单示例。mek_data_class插件(假设它提供了数据类生成和管理的功能)可以帮助开发者更方便地处理数据模型。以下是一个假设性的代码示例,展示如何定义和使用数据类。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  mek_data_class: ^latest_version  # 请替换为实际的最新版本号

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

2. 定义数据模型

假设我们有一个用户数据模型User,使用mek_data_class(假设它提供了类似JSON序列化和反序列化的功能)来定义它:

import 'package:mek_data_class/mek_data_class.dart';  // 假设插件提供这样的导入路径

@DataClass()
class User {
  String id;
  String name;
  int age;

  // 假设@DataClass()注解自动生成构造函数、getter、setter、toJson、fromJson等方法
}

3. 使用数据管理类

接下来,我们创建一个数据管理类DataManager,用于管理用户数据的CRUD(创建、读取、更新、删除)操作:

import 'dart:convert';
import 'package:flutter/services.dart';

class DataManager {
  List<User> users = [];

  // 读取本地存储的用户数据(假设使用JSON格式)
  Future<void> loadUsers() async {
    try {
      final String jsonData = await rootBundle.loadString('assets/users.json');
      final List<dynamic> body = jsonDecode(jsonData);
      
      users = body.map((dynamic item) => User.fromJson(item as Map<String, dynamic>)).toList();
    } catch (e) {
      print('Failed to load users: $e');
    }
  }

  // 保存用户数据到本地存储(假设使用JSON格式)
  Future<void> saveUsers() async {
    final List<Map<String, dynamic>> jsonUsers = users.map((User user) => user.toJson()).toList();
    final String jsonData = jsonEncode(jsonUsers);

    // 这里假设你有一个方法来将JSON数据保存到文件或其他存储中
    // 例如,你可能需要使用File API或其他插件来写入文件
    // 注意:实际代码需要根据你的存储方案进行调整
    // await File('path_to_save/users.json').writeAsString(jsonData);
  }

  // 添加新用户
  void addUser(User user) {
    users.add(user);
  }

  // 根据ID查找用户
  User getUserById(String id) {
    return users.firstWhereOrNull((User user) => user.id == id);
  }

  // 更新用户信息
  void updateUser(User user) {
    final User existingUser = getUserById(user.id);
    if (existingUser != null) {
      final index = users.indexOf(existingUser);
      users[index] = user;
    }
  }

  // 删除用户
  void deleteUser(String id) {
    users.removeWhere((User user) => user.id == id);
  }
}

4. 使用示例

在你的Flutter组件中,你可以这样使用DataManager来管理用户数据:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: UserListScreen(),
    );
  }
}

class UserListScreen extends StatefulWidget {
  @override
  _UserListScreenState createState() => _UserListScreenState();
}

class _UserListScreenState extends State<UserListScreen> {
  final DataManager dataManager = DataManager();

  @override
  void initState() {
    super.initState();
    dataManager.loadUsers();  // 加载用户数据
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('User List'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: FutureBuilder<void>(
          future: dataManager.loadUsers(),
          builder: (BuildContext context, AsyncSnapshot<void> snapshot) {
            if (snapshot.connectionState == ConnectionState.done) {
              return ListView.builder(
                itemCount: dataManager.users.length,
                itemBuilder: (BuildContext context, int index) {
                  final User user = dataManager.users[index];
                  return ListTile(
                    title: Text(user.name),
                    subtitle: Text('Age: ${user.age}'),
                    onTap: () {
                      // 这里可以添加点击事件,例如跳转到用户详情页面
                    },
                  );
                },
              );
            } else {
              return Center(child: CircularProgressIndicator());
            }
          },
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 添加新用户示例
          final User newUser = User(id: '123', name: 'John Doe', age: 30);
          dataManager.addUser(newUser);
          dataManager.saveUsers();  // 保存新用户数据
          setState(() {});  // 刷新UI
        },
        tooltip: 'Add User',
        child: Icon(Icons.add),
      ),
    );
  }
}

注意事项

  1. 插件假设:上述代码基于假设mek_data_class插件提供类似的功能,实际插件API可能有所不同,请参考官方文档。
  2. 存储方案:示例中未实现实际的文件存储操作,你需要根据需求选择合适的存储方案。
  3. 错误处理:示例代码简化了错误处理,实际项目中应添加更详细的错误处理逻辑。

希望这个示例能帮助你理解如何在Flutter项目中使用mek_data_class插件进行数据管理。

回到顶部