Flutter 3.22 集成 Appwrite 实现移动端认证与存储

Appwrite 是开源后端平台,提供类似 Firebase 的认证、存储等功能,支持自托管。以下是完整实现方案:


1. 环境准备

1.1 部署 Appwrite 服务

  • 通过 Docker 快速部署(需提前安装 Docker):
    docker run -it --rm \
      --volume /var/run/docker.sock:/var/run/docker.sock \
      --volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \
      --entrypoint="install" \
      appwrite/appwrite:3.22.0
    

  • 访问 http://localhost 完成初始化,创建项目并获取 Project IDAPI Key

1.2 Flutter 项目配置
pubspec.yaml 添加依赖:

dependencies:
  appwrite: ^15.0.0  # 确保兼容 Flutter 3.22
  flutter_bloc: ^8.1.3  # 状态管理(可选)


2. 初始化 Appwrite 客户端

创建 lib/services/appwrite_service.dart

import 'package:appwrite/appwrite.dart';

class AppwriteService {
  final Client client = Client();
  final Account account;
  final Storage storage;

  AppwriteService() 
    : account = Account(Client()),
      storage = Storage(Client()) {
    client
      .setEndpoint('http://YOUR_APPWRITE_IP/v1')  // 替换为实际IP
      .setProject('YOUR_PROJECT_ID')              // 替换为Project ID
      .setSelfSigned(status: true);               // 允许自签名证书(开发环境)
  }
}


3. 实现认证功能

3.1 用户注册

Future<void> register(String email, String password) async {
  try {
    await AppwriteService().account.create(
      userId: ID.unique(),
      email: email,
      password: password,
    );
  } on AppwriteException catch (e) {
    print('注册失败: ${e.message}');
  }
}

3.2 用户登录

Future<Session> login(String email, String password) async {
  try {
    return await AppwriteService().account.createEmailSession(
      email: email,
      password: password,
    );
  } on AppwriteException catch (e) {
    throw Exception('登录失败: ${e.message}');
  }
}

3.3 登出与会话管理

// 登出
Future<void> logout() => AppwriteService().account.deleteSession(sessionId: 'current');

// 检查登录状态
Future<User> getCurrentUser() => AppwriteService().account.get();


4. 实现存储功能

4.1 文件上传

Future<void> uploadFile(File file) async {
  try {
    final filename = path.basename(file.path);
    await AppwriteService().storage.createFile(
      bucketId: 'default',  // 替换为你的Bucket ID
      fileId: ID.unique(),
      file: InputFile.fromPath(path: file.path, filename: filename),
    );
  } on AppwriteException catch (e) {
    print('上传失败: ${e.message}');
  }
}

4.2 文件下载与预览

Future<Uint8List> downloadFile(String fileId) async {
  return await AppwriteService().storage.getFileView(
    bucketId: 'default',
    fileId: fileId,
  );
}

4.3 文件列表获取

Future<FileList> listFiles() async {
  return await AppwriteService().storage.listFiles(
    bucketId: 'default',
  );
}


5. 安全配置建议
  1. 认证规则:在 Appwrite 控制台设置用户权限(如仅认证用户可访问存储桶)。
  2. HTTPS:生产环境务必启用 HTTPS 并禁用 .setSelfSigned()
  3. 敏感数据:将 Project ID 和 API Key 存储在 .env 文件,使用 flutter_dotenv 加载。

6. 调试与常见问题
  • 连接失败:检查防火墙是否开放端口(默认 80),确认 Docker 容器运行正常。
  • 文件权限:在 Appwrite 控制台调整存储桶的读写规则。
  • 依赖冲突:运行 flutter pub upgrade --major-versions 解决版本冲突。

完整示例代码参考 Appwrite Flutter Demo
通过此方案,可完全替代 Firebase 实现认证和存储功能,同时保持数据主权。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐