Flutter 3.22 集成 Firebase 开源替代品(Appwrite):移动端认证 / 存储功能实现
·
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 ID 和 API 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. 安全配置建议
- 认证规则:在 Appwrite 控制台设置用户权限(如仅认证用户可访问存储桶)。
- HTTPS:生产环境务必启用 HTTPS 并禁用
.setSelfSigned()。 - 敏感数据:将 Project ID 和 API Key 存储在
.env文件,使用flutter_dotenv加载。
6. 调试与常见问题
- 连接失败:检查防火墙是否开放端口(默认
80),确认 Docker 容器运行正常。 - 文件权限:在 Appwrite 控制台调整存储桶的读写规则。
- 依赖冲突:运行
flutter pub upgrade --major-versions解决版本冲突。
完整示例代码参考 Appwrite Flutter Demo
通过此方案,可完全替代 Firebase 实现认证和存储功能,同时保持数据主权。
更多推荐


所有评论(0)