Flutter后端管理集成插件directus的使用

Flutter后端管理集成插件directus的使用

Directus SDK for Dart/Flutter

这是一个非官方的Directus SDK,适用于Dart和Flutter,提供了读取、创建、更新和删除用户及系统数据、认证和活动访问的API。该包是基于JS版本的SDK移植而来,大多数方法与JS版本相同,但由于Dart类型系统的差异,存在一些不同之处。

安装

pubspec.yaml文件中添加directusdependencies,然后运行pub getflutter 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');

文件

文件的方法如readOnereadManydeleteOnedeleteManyitems(collection)相同。目前有一个实验性的uploadFile方法,但还不稳定。没有updateOneupdateManycreateOnecreateMany方法。

final files = sdk.files;

其他资源

其他资源如collectionsfieldsfolderspermissionspresetsrelationsrevisionsrolessettingsusers等都具有与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

1 回复

更多关于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');
  }
}

注意

  1. 安全性:在实际应用中,不要将API密钥硬编码在客户端代码中。考虑使用环境变量或安全的密钥管理服务。
  2. 错误处理:示例中的错误处理相对简单。在生产环境中,你可能需要更详细的错误日志记录和用户友好的错误消息。
  3. 分页和过滤:Directus支持丰富的查询参数,如分页、排序和过滤。你可以通过queryParams参数传递给readItems方法来利用这些功能。

这个示例展示了如何在Flutter项目中集成Directus作为后端管理,并通过HTTP请求执行基本的CRUD操作。根据你的具体需求,你可能需要扩展这个客户端类以支持更多的Directus功能。

回到顶部