Flutter数据增删改查插件crud_table的使用

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

Flutter数据增删改查插件crud_table的使用

简介

CRUD Table Flutter 是一个强大的Flutter包,简化了为实体、对象或类创建CRUD UI的过程。该包具有高效的懒加载功能、可调整列宽、集成的CRUD表单以及可自定义的UI,提供了无缝的用户体验。通过 CRUD Table Flutter,您可以轻松管理和组织数据,提高生产力和效率。

功能特性

  • 懒加载表格:支持分页加载,提升性能。
  • 可调整列宽:用户可以根据需要调整列的宽度。
  • 集成的CRUD表单:提供添加、编辑和删除数据的功能。
  • 可自定义的UI:根据需求自定义界面样式。

示例图片

CRUD UI 懒加载
CRUD UI Lazy loading

开始使用

该包使用 Riverpod 进行状态管理。请确保导入 flutter_riverpod 并在应用中包裹 ProviderScope

import 'package:flutter_riverpod/flutter_riverpod.dart';

void main() {
  runApp(
    ProviderScope(
      child: MyApp(),
    ),
  );
}

安装

pubspec.yaml 文件中添加依赖:

dependencies:
  crud_table: 

然后在Dart文件中导入:

import 'package:crud_table/crud_table.dart';

使用示例

以下是一个完整的示例代码,展示了如何使用 CrudTable 实现数据的增删改查功能。

import 'package:crud_table/crud_table.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

// 假设我们有一个 UserTask 类
class UserTask {
  int? id;
  String? taskCode;
  String? description;
  bool? active;

  UserTask({this.id, this.taskCode, this.description, this.active});
}

// 假设我们有一个 UserTasksService 类来处理数据操作
class UserTasksService {
  static UserTasksService? _instance;

  factory UserTasksService() => _instance ??= UserTasksService._();

  UserTasksService._();

  // 模拟添加任务
  Future<UserTask> addTask(UserTask task) async {
    // 实际开发中应调用API或数据库操作
    return Future.delayed(Duration(seconds: 1), () => task);
  }

  // 模拟更新任务
  Future<UserTask> updateTask(UserTask task, int id) async {
    // 实际开发中应调用API或数据库操作
    return Future.delayed(Duration(seconds: 1), () => task);
  }

  // 模拟删除任务
  Future<void> deleteTask(int id) async {
    // 实际开发中应调用API或数据库操作
    await Future.delayed(Duration(seconds: 1));
  }

  // 模拟获取任务列表
  Future<List<UserTask>> getTasks(int pageNumber, int limit) async {
    // 实际开发中应调用API或数据库操作
    return Future.delayed(Duration(seconds: 1), () => [
          UserTask(id: 1, taskCode: "Task 1", description: "Description 1", active: true),
          UserTask(id: 2, taskCode: "Task 2", description: "Description 2", active: false),
        ]);
  }
}

void main() {
  runApp(
    const ProviderScope(
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);
  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Column(
        mainAxisSize: MainAxisSize.min,
        children: [
          Expanded(
            child: CrudTable<UserTask>(
              crudViewSource: createCrudSource(),
              onTap: (t) {
                t as UserTask;
              },
            ),
          ),
        ],
      ),
    );
  }

  CrudViewSource createCrudSource() {
    return CrudViewSource(
      columns: ["id", "code", "description", "active"], // 表格列名
      pageLimit: 20, // 每页显示的记录数
      rowHeight: 30, // 行高
      emptyEntityFactory: () => UserTask(), // 提供空对象,用于表单提交时获取
      createRows: (data, index) {
        data as UserTask;
        List<Widget> rows = [];
        rows.add(Text(data.id.toString(), style: const TextStyle(fontSize: 16)));
        rows.add(Text(data.taskCode.toString(), style: const TextStyle(fontSize: 16)));
        rows.add(Text(data.description.toString(), style: const TextStyle(fontSize: 16)));
        rows.add(Text(data.active.toString(), style: const TextStyle(fontSize: 16)));
        return rows;
      },
      createForm: (data) {
        data as UserTask;

        List<FormSection> fields = [];

        FormSection section1 = FormSection(
            sectionTitle: "系统任务",
            formRows: () {
              List<FormRow> r = [];
              FormRow r1 = FormRow(formItems: () {
                List<FormItem> items = [];
                items.add(FormItem(
                  ratio: 1,
                  item: TextFormField(
                    key: CrudTableUtil.formFieldKey(data.id),
                    initialValue: CrudTableUtil.formFieldInitValue(data.id),
                    decoration: const InputDecoration(
                      labelText: 'ID',
                      border: OutlineInputBorder(),
                    ),
                    enabled: false, // ID字段不可编辑
                  ),
                ));
                items.add(FormItem(
                  ratio: 1,
                  item: TextFormField(
                    key: CrudTableUtil.formFieldKey(data.taskCode),
                    initialValue: CrudTableUtil.formFieldInitValue(data.taskCode),
                    onSaved: (v) {
                      data.taskCode = v;
                    },
                    validator: (value) {
                      if (value!.isEmpty) {
                        return '请输入任务代码!';
                      }
                      return null;
                    },
                    decoration: const InputDecoration(
                      labelText: '代码',
                      border: OutlineInputBorder(),
                    ),
                  ),
                ));
                return items;
              });
              r.add(r1);
              return r;
            });

        FormSection section2 = FormSection(
            sectionTitle: "系统任务部分02",
            formRows: () {
              List<FormRow> r = [];
              FormRow r1 = FormRow(formItems: () {
                List<FormItem> items = [];
                items.add(FormItem(
                  ratio: 1,
                  item: TextFormField(
                    key: CrudTableUtil.formFieldKey(data.description),
                    initialValue: CrudTableUtil.formFieldInitValue(data.description),
                    validator: (value) {
                      if (value!.isEmpty) {
                        return '请输入描述!';
                      }
                      return null;
                    },
                    onSaved: (v) {
                      data.description = v;
                    },
                    decoration: const InputDecoration(
                      labelText: '描述',
                      border: OutlineInputBorder(),
                    ),
                  ),
                ));
                return items;
              });
              FormRow r2 = FormRow(formItems: () {
                return [
                  FormItem(
                    ratio: 1,
                    item: CheckboxListTile(
                      title: const Text("激活"),
                      controlAffinity: ListTileControlAffinity.leading,
                      value: data.active ?? false,
                      onChanged: (bool? value) {
                        setState(() {
                          data.active = value!;
                        });
                      },
                    ),
                  )
                ];
              });
              r.add(r1);
              r.add(r2);
              return r;
            });

        fields.add(section1);
        fields.add(section2);
        return fields;
      },
      crudActionListener: CrudActionListener<UserTask>(
        add: (data) async {
          UserTasksService userS = UserTasksService();
          return userS.addTask(data);
        },
        edit: (data) async {
          data as UserTask;
          UserTasksService userS = UserTasksService();
          return userS.updateTask(data, data.id!.toInt());
        },
        delete: (data) async {
          data as UserTask;
          UserTasksService userS = UserTasksService();
          return userS.deleteTask(data.id!.toInt());
        },
      ),
      onPageChange: (pagination) async {
        UserTasksService userS = UserTasksService();
        return userS.getTasks(pagination.pageNumber, pagination.limit);
      },
    );
  }
}

更多关于Flutter数据增删改查插件crud_table的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据增删改查插件crud_table的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 crud_table 插件在 Flutter 中实现数据增删改查(CRUD)操作的代码示例。crud_table 插件简化了与 SQLite 数据库进行交互的过程,使得在 Flutter 应用中实现数据操作变得更加容易。

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

dependencies:
  flutter:
    sdk: flutter
  crud_table: ^最新版本号  # 请替换为最新版本号

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

接下来,创建一个 Flutter 应用,并在其中使用 crud_table 实现基本的 CRUD 操作。以下是一个完整的示例:

import 'package:flutter/material.dart';
import 'package:crud_table/crud_table.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter CRUD Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late CrudTable<User> _crudTable;

  @override
  void initState() {
    super.initState();
    // 初始化 CRUD Table
    _crudTable = CrudTable<User>(
      db: DatabaseHelper.instance.database,
      tableName: 'users',
      columns: User.columns,
    );

    // 创建表(如果不存在)
    _crudTable.createTable();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter CRUD Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          children: [
            ElevatedButton(
              onPressed: () async {
                // 添加新用户
                User newUser = User(
                  id: null, // 自动生成ID
                  name: 'John Doe',
                  email: 'john.doe@example.com',
                );
                await _crudTable.insert(newUser);
                print('User added: $newUser');
              },
              child: Text('Add User'),
            ),
            ElevatedButton(
              onPressed: () async {
                // 更新用户信息
                User userToUpdate = await _crudTable.getById(1); // 假设要更新ID为1的用户
                userToUpdate!.email = 'john.newemail@example.com';
                await _crudTable.update(userToUpdate);
                print('User updated: $userToUpdate');
              },
              child: Text('Update User'),
            ),
            ElevatedButton(
              onPressed: () async {
                // 删除用户
                await _crudTable.deleteById(1); // 删除ID为1的用户
                print('User deleted with ID: 1');
              },
              child: Text('Delete User'),
            ),
            ElevatedButton(
              onPressed: () async {
                // 获取所有用户
                List<User> users = await _crudTable.getAll();
                print('All Users: $users');
              },
              child: Text('Get All Users'),
            ),
          ],
        ),
      ),
    );
  }
}

class User {
  int? id;
  String name;
  String email;

  static List<ColumnInfo> columns = [
    ColumnInfo(name: 'id', type: 'INTEGER PRIMARY KEY AUTOINCREMENT'),
    ColumnInfo(name: 'name', type: 'TEXT NOT NULL'),
    ColumnInfo(name: 'email', type: 'TEXT NOT NULL'),
  ];

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

  @override
  String toString() {
    return 'User{id: $id, name: $name, email: $email}';
  }
}

class DatabaseHelper {
  DatabaseHelper._();

  static final DatabaseHelper instance = DatabaseHelper._();
  late Database database;

  Future<Database> get database async {
    if (database != null) return database;
    database = await openDatabase(
      join(await getDatabasesPath(), 'example.db'),
      onCreate: (db, version) {
        // 在这里可以创建其他表
      },
      version: 1,
    );
    return database;
  }
}

在这个示例中,我们创建了一个 User 类来表示数据库中的用户表,并使用 crud_table 插件的 CrudTable 类来管理用户数据的 CRUD 操作。我们定义了四个按钮,分别用于添加新用户、更新用户信息、删除用户以及获取所有用户。

注意:在实际应用中,你需要处理更多的错误检查和边界情况,例如检查用户是否存在、处理数据库操作中的异常等。此外,为了保持示例的简洁性,一些最佳实践(如使用 BLoCProvider 进行状态管理)在此示例中未包含。

回到顶部