Flutter数据增删改查插件crud_table的使用
Flutter数据增删改查插件crud_table的使用
简介
CRUD Table Flutter
是一个强大的Flutter包,简化了为实体、对象或类创建CRUD UI的过程。该包具有高效的懒加载功能、可调整列宽、集成的CRUD表单以及可自定义的UI,提供了无缝的用户体验。通过 CRUD Table Flutter
,您可以轻松管理和组织数据,提高生产力和效率。
功能特性
- 懒加载表格:支持分页加载,提升性能。
- 可调整列宽:用户可以根据需要调整列的宽度。
- 集成的CRUD表单:提供添加、编辑和删除数据的功能。
- 可自定义的UI:根据需求自定义界面样式。
示例图片
CRUD UI | 懒加载 |
---|---|
开始使用
该包使用 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
更多关于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 操作。我们定义了四个按钮,分别用于添加新用户、更新用户信息、删除用户以及获取所有用户。
注意:在实际应用中,你需要处理更多的错误检查和边界情况,例如检查用户是否存在、处理数据库操作中的异常等。此外,为了保持示例的简洁性,一些最佳实践(如使用 BLoC
或 Provider
进行状态管理)在此示例中未包含。