Flutter集成Firebase实时数据库:事务中止与连接异常排查
Flutter写入Firebase实时数据库事务回滚,连接频繁断开问题排查与解决
问题场景
使用Flutter向Firebase实时数据库写入基础数据,已完成数据库配置,连接看似正常,但数据写入后事务被回滚。模拟器网络稳定,但日志显示连接频繁断开重建。
代码示例
FirebaseDatabase.instance.setLoggingEnabled(true); ... DatabaseReference ref = FirebaseDatabase.instance.refFromURL('my DB URL here'); ref = ref.child('users/123'); await ref.set({"name": "John"});
运行日志
D/PersistentConnection(15427): pc_0 - Connection interrupted for: repo_interrupt D/Connection(15427): conn_82 - closing realtime connection D/WebSocket(15427): ws_82 - websocket is being closed D/PersistentConnection(15427): pc_0 - Got on disconnect due to OTHER D/WebSocket(15427): ws_82 - closed D/RepoOperation(15427): set: /users/123 D/DataOperation(15427): set: /users/123 { D/DataOperation(15427): name=John D/DataOperation(15427): } D/Persistence(15427): Starting transaction. D/Persistence(15427): Persisted user overwrite in 1ms D/Persistence(15427): Transaction completed. Elapsed: 9ms D/RepoOperation(15427): Aborting transactions for path: /users/123. Affected: /users/123 D/PersistentConnection(15427): pc_0 - Connection no longer interrupted for: repo_interrupt D/PersistentConnection(15427): pc_0 - Scheduling connection attempt D/ConnectionRetryHelper(15427): Scheduling retry in 0ms D/PersistentConnection(15427): pc_0 - Trying to fetch auth token D/PersistentConnection(15427): pc_0 - Trying to fetch app check token D/PersistentConnection(15427): pc_0 - Successfully fetched token, opening connection D/Connection(15427): conn_83 - Opening a connection
使用的依赖版本
firebase_core: ^2.4.1 firebase_database: ^10.0.9 firebase_auth: ^4.2.10
成因分析
- 安全规则权限不足:实时数据库默认规则可能限制了写入权限,未通过权限校验的写入会触发服务器断开连接,导致本地事务回滚。
- 认证/App Check配置异常:日志显示重连时需获取auth和App Check令牌,若令牌获取失败或验证不通过,会导致连接被拒绝,写入无法同步到云端。
- 依赖版本兼容性问题:Firebase各依赖包之间可能存在隐性版本冲突,导致连接逻辑异常。
- 模拟器网络环境问题:即使显示网络稳定,可能存在WebSocket连接被拦截、DNS解析异常等情况,导致连接频繁中断。
解决步骤
1. 检查并调整数据库安全规则
- 临时开放权限测试(仅用于排查,上线前必须修改):
若写入成功,说明是权限问题,后续配置精细规则,比如仅允许认证用户写入指定路径:{ "rules": { ".read": true, ".write": true } }{ "rules": { "users": { "$uid": { ".read": "auth != null && auth.uid == $uid", ".write": "auth != null && auth.uid == $uid" } } } }
2. 验证认证与App Check配置
- 确认用户已完成认证,若未认证可先添加匿名登录测试:
User? user = FirebaseAuth.instance.currentUser; if (user == null) { await FirebaseAuth.instance.signInAnonymously(); } - 若启用了App Check,确保Flutter端已正确初始化,且Firebase控制台配置了对应的验证提供者(如SafetyNet、Recaptcha)。
3. 更新Firebase依赖至最新稳定版
执行命令更新所有Firebase相关依赖,避免版本冲突:
flutter pub upgrade firebase_core firebase_database firebase_auth
4. 排查模拟器网络环境
- 在模拟器中访问Firebase实时数据库URL,确认网络可正常连通。
- 暂时关闭本地防火墙,测试WebSocket连接是否被拦截。
- 切换至物理设备测试,排除模拟器网络异常。
5. 启用详细日志排查
补充Firebase核心日志,获取更多连接细节:
// 确认Firebase配置正确 print(FirebaseApp.instance.options.databaseURL); FirebaseDatabase.instance.setLoggingEnabled(true);
查看是否存在认证失败、令牌无效等具体错误信息。
内容的提问来源于stack exchange,提问作者Kras
相关产品推荐
相关产品推荐

