You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

成因分析

  1. 安全规则权限不足:实时数据库默认规则可能限制了写入权限,未通过权限校验的写入会触发服务器断开连接,导致本地事务回滚。
  2. 认证/App Check配置异常:日志显示重连时需获取auth和App Check令牌,若令牌获取失败或验证不通过,会导致连接被拒绝,写入无法同步到云端。
  3. 依赖版本兼容性问题:Firebase各依赖包之间可能存在隐性版本冲突,导致连接逻辑异常。
  4. 模拟器网络环境问题:即使显示网络稳定,可能存在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 16:07:54