Flutter后端管理集成插件directus的使用
Flutter后端管理集成插件directus的使用
Directus SDK for Dart/Flutter
这是一个非官方的Directus SDK,适用于Dart和Flutter,提供了读取、创建、更新和删除用户及系统数据、认证和活动访问的API。该包是基于JS版本的SDK移植而来,大多数方法与JS版本相同,但由于Dart类型系统的差异,存在一些不同之处。
安装
在pubspec.yaml文件中添加directus到dependencies,然后运行pub get或flutter pub get。更多安装信息可以查看这里。
dependencies:
directus: ^x.x.x # 请替换为最新的版本号
快速开始
创建实例并初始化
你必须运行.init()以初始化存储,否则将抛出DirectusError错误。
使用directus
此包需要Flutter,因为它使用shared_preferences来持久化数据。
import 'package:directus/directus.dart';
final sdk = await Directus('http://localhost:8055').init();
使用directus_core
此包不需要Flutter,但不知道如何存储数据,因此你需要传递一个自定义的存储实现,该实现继承自DirectusStorage。我们提供了一个内存存储,在应用存活期间保存你的数据。
import 'package:directus_core/directus_core.dart';
// 提供你的自定义存储
final sdk = await DirectusCore('http://localhost:8055', storage: MemoryStorage()).init();
示例代码
单例模式
import 'package:directus/directus.dart';
await DirectusSingleton.init('http://localhost:8055');
final sdk = DirectusSingleton.instance;
操作集合
获取单个项
final res = await sdk.items('users').readOne('someId');
print(res.data['name']);
获取多个项
final users = await sdk.items('users').readMany(Query(limit: 5, offset: 5));
users.data.forEach((user) => print(user['name']));
final firstThreeUsers = await DirectusSdk().items('users').readMany(
filter: Filters({'id': Filter.isIn(['1', '2'])})
);
firstThreeUsers.data.forEach((user) => print(user['name']));
创建单个项
final createdUser = await sdk.items('users').createOne({'name': 'Test'});
创建多个项
final createdUsers = await sdk.items('users').createMany([{'name': 'Test'}, {'name': 'Two'}]);
更新单个项
final updatedUser = await sdk.items('users').updateOne(data: {'name': 'Test'}, id: '55');
更新多个项
final updatedUsers = await sdk.items('users').updateMany(data: {'name': 'Test'}, ids: ['55']);
删除单个项
await sdk.items('users').deleteOne('55');
删除多个项
await sdk.items('users').deleteMany(['55']);
认证
检查用户是否登录
final isLoggedIn = sdk.auth.isLoggedIn;
登录
await sdk.auth.login(email: 'test@example.com', password: 'password');
注销
await sdk.logout();
获取当前用户
final user = await sdk.auth.currentUser?.read();
更新当前用户
final updatedUser = await sdk.auth.currentUser?.update({'name': 'Dart'});
启用双因素认证
await sdk.auth.tfa?.enable('current-password');
禁用2FA
await sdk.auth.fta?.disable('otp');
请求密码重置
await sdk.auth.forgottenPassword.request('email@example.com');
重置密码
await sdk.auth.forgottenPassword.reset(token: 'some-token', password: 'new-password');
活动
读取活动
final activity = await sdk.activity.readOne('some-id');
final activities = await sdk.activity.readMany(Query(limit: 10));
添加评论
final comment = await sdk.activity.createComment(collection: 'posts', item: 'some-id', comment: 'Awesome post');
更新评论
final updatedComment = await sdk.activity.updateComment(id: '50', comment: 'Awesome change!');
删除评论
await sdk.activity.deleteComment('55');
文件
文件的方法如readOne、readMany、deleteOne、deleteMany与items(collection)相同。目前有一个实验性的uploadFile方法,但还不稳定。没有updateOne、updateMany、createOne和createMany方法。
final files = sdk.files;
其他资源
其他资源如collections、fields、folders、permissions、presets、relations、revisions、roles、settings、users等都具有与items(collection)相同的方法。
实用工具
获取随机字符串
final randomString = await sdk.utils.randomString(15);
生成哈希值
final hash = await sdk.utils.generateHash('value-to-hash');
验证哈希值
final correctHash = await sdk.utils.verifyHash('Some value.', 'hashed-value');
排序集合中的项
await sdk.utils.sort(collection: 'users', itemPk: '5', toPk: '10');
回滚到之前的修订版
await sdk.utils.revert('25');
示例Demo
以下是一个完整的示例代码,展示了如何连接到Directus服务器并获取帖子数据:
import 'package:directus/directus.dart';
void main() async {
// 初始化Directus SDK
final sdk = await Directus('http://localhost:8055').init();
try {
// 获取帖子数据
final results = await sdk.items('posts').readMany();
print('Posts:');
results.data.forEach((post) => print(post));
// 获取单个用户数据
final user = await sdk.items('users').readOne('someUserId');
print('User:');
print(user.data);
// 创建新用户
final newUser = await sdk.items('users').createOne({'name': 'New User'});
print('Created User:');
print(newUser);
// 更新用户
final updatedUser = await sdk.items('users').updateOne(data: {'name': 'Updated User'}, id: 'someUserId');
print('Updated User:');
print(updatedUser);
// 删除用户
await sdk.items('users').deleteOne('someUserId');
print('User deleted.');
// 检查用户是否登录
final isLoggedIn = sdk.auth.isLoggedIn;
print('Is logged in: $isLoggedIn');
// 登录用户
await sdk.auth.login(email: 'test@example.com', password: 'password');
print('Logged in successfully.');
// 获取当前用户
final currentUser = await sdk.auth.currentUser?.read();
print('Current User:');
print(currentUser);
// 获取服务器信息
final serverInfo = await sdk.server.info();
print('Server Info:');
print(serverInfo);
} catch (e) {
print('Error: $e');
}
}
这个示例展示了如何使用Directus SDK进行常见的CRUD操作以及认证和服务器信息查询。希望这能帮助你在Flutter项目中集成Directus后端管理功能!
更多关于Flutter后端管理集成插件directus的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter后端管理集成插件directus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中集成并使用Directus作为后端管理的示例代码。这个示例将展示如何连接到Directus服务器,执行一些基本的CRUD(创建、读取、更新、删除)操作。
1. 添加依赖
首先,你需要在pubspec.yaml文件中添加http包,用于发送HTTP请求。
dependencies:
flutter:
sdk: flutter
http: ^0.13.3
2. 创建Directus客户端
接下来,创建一个简单的Directus客户端类,用于管理API请求。
import 'dart:convert';
import 'package:http/http.dart' as http;
class DirectusClient {
final String baseUrl;
final String projectId;
final String apiKey;
DirectusClient({required this.baseUrl, required this.projectId, required this.apiKey});
Future<Map<String, dynamic>> _request(String endpoint, {Map<String, dynamic>? body, Map<String, String>? headers}) async {
var url = Uri.parse('$baseUrl/items/$endpoint');
headers ??= {};
headers['Authorization'] = 'Bearer $apiKey';
headers['X-Project-Id'] = projectId;
headers['Content-Type'] = 'application/json';
var response = await http.post(url, headers: headers, body: body != null ? jsonEncode(body) : null);
if (response.statusCode == 200 || response.statusCode == 201) {
return jsonDecode(response.body);
} else {
throw Exception('Failed to fetch data: ${response.statusCode}\nBody: ${response.body}');
}
}
Future<Map<String, dynamic>> createItem(String collection, Map<String, dynamic> data) {
return _request(collection, body: data);
}
Future<List<Map<String, dynamic>>> readItems(String collection, {Map<String, String>? queryParams}) {
var url = Uri.parse('$baseUrl/items/$collection');
if (queryParams != null) {
url = url.replace(queryParameters: queryParams);
}
return http.get(url, headers: {
'Authorization': 'Bearer $apiKey',
'X-Project-Id': projectId,
}).then((response) {
if (response.statusCode == 200) {
return jsonDecode(response.body)['data'] as List<Map<String, dynamic>>;
} else {
throw Exception('Failed to fetch data: ${response.statusCode}\nBody: ${response.body}');
}
});
}
Future<Map<String, dynamic>> updateItem(String collection, String id, Map<String, dynamic> data) {
return _request('$collection/$id', body: data);
}
Future<void> deleteItem(String collection, String id) {
var url = Uri.parse('$baseUrl/items/$collection/$id');
return http.delete(url, headers: {
'Authorization': 'Bearer $apiKey',
'X-Project-Id': projectId,
}).then((response) {
if (response.statusCode != 200 && response.statusCode != 204) {
throw Exception('Failed to delete item: ${response.statusCode}\nBody: ${response.body}');
}
});
}
}
3. 使用Directus客户端
下面是如何使用这个Directus客户端类来执行一些基本的CRUD操作。
void main() async {
var client = DirectusClient(
baseUrl: 'https://your-directus-instance.com/api/v1',
projectId: 'your-project-id',
apiKey: 'your-api-key',
);
// 创建新项
try {
var createdItem = await client.createItem('your_collection', {
'field1': 'value1',
'field2': 'value2',
});
print('Created item: $createdItem');
} catch (e) {
print('Error creating item: $e');
}
// 读取项
try {
var items = await client.readItems('your_collection');
print('Read items: $items');
} catch (e) {
print('Error reading items: $e');
}
// 更新项
try {
var updatedItem = await client.updateItem('your_collection', 'item_id', {
'field1': 'new_value1',
});
print('Updated item: $updatedItem');
} catch (e) {
print('Error updating item: $e');
}
// 删除项
try {
await client.deleteItem('your_collection', 'item_id');
print('Deleted item');
} catch (e) {
print('Error deleting item: $e');
}
}
注意
- 安全性:在实际应用中,不要将API密钥硬编码在客户端代码中。考虑使用环境变量或安全的密钥管理服务。
- 错误处理:示例中的错误处理相对简单。在生产环境中,你可能需要更详细的错误日志记录和用户友好的错误消息。
- 分页和过滤:Directus支持丰富的查询参数,如分页、排序和过滤。你可以通过
queryParams参数传递给readItems方法来利用这些功能。
这个示例展示了如何在Flutter项目中集成Directus作为后端管理,并通过HTTP请求执行基本的CRUD操作。根据你的具体需求,你可能需要扩展这个客户端类以支持更多的Directus功能。

