Flutter未知功能插件snail的使用
Flutter未知功能插件snail的使用
🐌 Snail: A Simple ORM-like Library for Flutter/Dart 🐦
Snail 是一个受 Spring Boot 的 JPA 启发,旨在简化 Flutter/Dart 应用程序中 SQLite 数据库管理的库。它的使用像蜗牛一样简单(但功能强大如火箭)!
✨ 特性
- ✅ 增删改查(CRUD)操作。
- 🔍 基于方法命名约定的动态查询方法。
- 🛠️ 根据字段定义创建表。
- 🔄 实体与数据库行之间的自动映射。
- 🔗 支持 snake_case 和 camelCase 转换。
- 📜 分页、排序和过滤支持。
📥 安装
在 pubspec.yaml
中添加以下依赖:
dependencies:
snail: ^1.1.2
Getting Started 🏁
创建仓库 📦
要为您的模型创建一个仓库,请扩展 SnailRepository
类:
import 'package:snail/snail.dart';
class UserRepository extends SnailRepository<User, int> {
UserRepository() : super(
tableName: 'users',
primaryKeyColumn: 'id',
defineFields: {
'id': int,
'name': String,
'email': String,
'isActive': bool,
},
);
@override
Map<String, dynamic> toMap(User entity) => entity.toMap();
@override
User fromMap(Map<String, dynamic> map) => User.fromMap(map);
}
class User {
final int id;
final String name;
final String email;
final bool isActive;
User({
required this.id,
required this.name,
required this.email,
required this.isActive,
});
Map<String, dynamic> toMap() {
return {
'id': id,
'name': name,
'email': email,
'isActive': isActive,
};
}
factory User.fromMap(Map<String, dynamic> map) {
return User(
id: map['id']?.toInt() ?? 0,
name: map['name'] ?? '',
email: map['email'] ?? '',
isActive: map['isActive'] ?? false,
);
}
}
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Snail.initialize(
repositories: [
UserRepository(),
],
);
runApp(AppWidget());
}
使用仓库 🔧
void main() async {
final userRepository = UserRepository();
// Save a user
await userRepository.save(User(id: 1, name: 'John Doe', email: 'john@example.com', isActive: true));
// Find a user by ID
final user = await userRepository.findById(1);
// Find all users
final users = await userRepository.findAll();
// Delete a user
await userRepository.deleteById(1);
}
动态方法 🔍
dynamicMethod
允许根据方法命名构造 SQL 查询。命名结构应遵循标准约定:
命名结构 🛠️
- 前缀:
find
或findAll
- 连接词:
And
,Or
- 操作符:
Between
,LessThan
,GreaterThan
,Like
,StartingWith
,EndingWith
,Containing
,In
,NotIn
,OrderBy
,True
,False
,IsNull
,NotNull
示例命名约定 📖
findByTitle(String title);
findById(int id);
findByTitleAndDescription(String title, String description);
findByTitleOrDescription(String title, String description);
findByTitleStartingWith(String title);
findByTitleEndingWith(String title);
findByTitleContaining(String title);
findByIdLessThan(int id);
findByIdGreaterThan(int id);
findByDateBetween(DateTime startDate, DateTime endDate);
findByTitleStartingWithAndIdLessThan(String title, int id);
findByTitleContainingOrDescriptionLike(String title, String description);
findByIdIn(List<int> ids);
findByIdNotIn(List<int> ids);
findByTitleOrderByDate(String title);
findByTitleOrderByDateDesc(String title);
findByTitleAndDescriptionOrderByDate(String title, String description);
findByIsActiveTrue();
findByIsActiveFalse();
findByTitleIsNull();
findByTitleNotNull();
使用示例 📝
Future<List<User>> findByTitleStartingWith(String title) {
return dynamicMethod('findByTitleStartingWith', [title]);
}
过滤器:分页、排序和大小 📊
Snail 支持通过 size
、page
和 sort
参数进行额外过滤:
size
: 每页获取的记录数。例如:size: 20
。page
: 获取的页码。例如:page: 1
(如果size
设置为 20,则获取前 20 条记录)。sort
: 排序顺序。使用格式<field>,<order>
,其中<order>
可以是asc
或desc
。例如:sort: 'createdAt,asc'
。
默认情况下,如果没有指定排序,Snail 会应用降序排序 (createdAt,desc
)。
示例用法 📝
Future<List<User>> findAllUsersWithPagination() async {
return await userRepository.findAll(
size: 20,
page: 1,
sort: 'createdAt,asc',
);
}
CRUD 操作 ⚙️
保存或更新实体 💾
Future<int> save(T entity);
保存或更新多个实体 💾💾
Future<List<int>> saveAll(List<T> entities);
按 ID 查找实体 🔍
Future<T?> findById(ID id);
查找所有实体 🔎
Future<List<T>> findAll({int? size, int? page, String? sort});
按 ID 删除实体 🗑️
Future<int> deleteById(ID id);
删除所有实体 🗑️🗑️
Future<int> deleteAll(List<T>? entities);
统计实体数量 🔢
Future<int> count();
自动字段:createdAt
和 updatedAt
🕒
Snail 自动为所有模型添加 createdAt
和 updatedAt
字段。这些字段跟踪记录的创建时间和最后更新时间。
在模型中的可选使用 📌
如果您希望在模型中显式包含这些字段,可以将它们定义为可选:
class TodoModel {
final String id;
final String title;
final bool isCompleted;
final DateTime? createdAt;
final DateTime? updatedAt;
TodoModel({
required this.id,
required this.title,
this.isCompleted = false,
this.createdAt,
this.updatedAt,
});
Map<String, dynamic> toMap() {
return {
'id': id,
'title': title,
'isCompleted': isCompleted,
'createdAt': createdAt,
'updatedAt': updatedAt,
};
}
factory TodoModel.fromMap(Map<String, dynamic> map) {
return TodoModel(
id: map['id'] as String,
title: map['title'] as String,
isCompleted: map['isCompleted'] as bool,
createdAt: map['createdAt'] as DateTime?,
updatedAt: map['updatedAt'] as DateTime?,
);
}
}
Full API 📚
以下是 Snail Repository 提供的完整方法列表:
方法 | 描述 |
---|---|
save(T entity) |
将实体保存或更新到数据库中。 |
saveAll(List<T> entities) |
将多个实体保存或更新到数据库中。 |
findById(ID id) |
通过主键查找实体。 |
findAll({int? size, int? page, String? sort}) |
带有分页和排序选项检索所有实体。 |
deleteAll(List<T>? entities) |
删除所有实体或指定的一组实体。 |
count() |
统计数据库中实体的总数。 |
dynamicMethod(String name, List<Object?> params) |
根据动态方法命名约定执行查询。 |
Contributing 🤝
欢迎提交拉取请求贡献代码!您的贡献非常宝贵!💡
License 📜
本项目采用 MIT 许可证。
Made with ❤️ for Flutter developers! 🎯
更多关于Flutter未知功能插件snail的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter未知功能插件snail的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中,snail
可能不是一个广为人知的插件,因此在没有具体文档或广泛社区支持的情况下,提供确切的代码案例可能有些困难。不过,我可以展示一个典型的 Flutter 插件使用流程,并假设 snail
插件遵循类似的结构。通常,Flutter 插件的使用包括以下几个步骤:
- 添加依赖:在
pubspec.yaml
文件中添加插件依赖。 - 导入插件:在 Dart 文件中导入插件。
- 使用插件功能:根据插件提供的 API 使用其功能。
假设 snail
插件已经发布在 pub.dev 上(实际上可能不存在,这里仅作示例),以下是一个假设的使用流程:
1. 添加依赖
在 pubspec.yaml
文件中添加 snail
插件依赖:
dependencies:
flutter:
sdk: flutter
snail: ^x.y.z # 假设最新版本是 x.y.z
然后运行 flutter pub get
来获取依赖。
2. 导入插件
在需要使用 snail
插件功能的 Dart 文件中导入它:
import 'package:snail/snail.dart';
3. 使用插件功能
假设 snail
插件提供了一个名为 performUnknownTask
的方法,该方法接受一些参数并返回一个 Future
。以下是如何调用这个方法的示例代码:
import 'package:flutter/material.dart';
import 'package:snail/snail.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Snail Plugin Example'),
),
body: Center(
child: ElevatedButton(
onPressed: () async {
try {
// 假设 performUnknownTask 是插件提供的方法
var result = await Snail.performUnknownTask(param1: 'value1', param2: 123);
print('Result from Snail: $result');
} catch (e) {
print('Error using Snail: $e');
}
},
child: Text('Perform Unknown Task'),
),
),
),
);
}
}
注意
- 上面的代码是一个假设的示例,因为
snail
插件实际上可能不存在或具有完全不同的 API。 - 在实际使用中,你需要查阅
snail
插件的官方文档来了解其提供的具体方法和参数。 - 如果
snail
插件没有发布在 pub.dev 上,你可能需要从源代码手动添加依赖,这通常涉及将插件源代码作为子模块或将其放置在项目的特定目录中。
由于 snail
插件的具体信息未知,以上内容仅作为 Flutter 插件使用流程的一般指导。如果你有更具体的关于 snail
插件的信息或需求,请提供更多细节以便给出更准确的帮助。