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

Android设备Firebase Realtime Database二次进入页面崩溃求助

Android设备第二次进入Firebase Realtime Database页面崩溃

在Android设备上运行应用时,第二次进入使用Firebase Realtime Database的页面会发生崩溃,错误堆栈跟踪如下:

java.lang.RuntimeException: Uncaught exception in Firebase Database runloop (20.0.6). If you are not already on the latest version of the Firebase SDKs, try updating your dependencies. Should this problem persist, please file a report at https://github.com/firebase/firebase-android-sdk
E/AndroidRuntime( 3934):        at com.google.firebase.database.android.AndroidPlatform$1$1.run(AndroidPlatform.java:96)
E/AndroidRuntime( 3934):        at android.os.Handler.handleCallback(Handler.java:938)
E/AndroidRuntime( 3934):        at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 3934):        at android.os.Looper.loopOnce(Looper.java:210)
E/AndroidRuntime( 3934):        at android.os.Looper.loop(Looper.java:299)
E/AndroidRuntime( 3934):        at android.app.ActivityThread.main(ActivityThread.java:8168)
E/AndroidRuntime( 3934):        at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime( 3934):        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556)
E/AndroidRuntime( 3934):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1037)
E/AndroidRuntime( 3934): Caused by: java.lang.RuntimeException: java.lang.AssertionError: hardAssert failed: listen() called twice for same QuerySpec.
E/AndroidRuntime( 3934):        at com.google.firebase.database.core.persistence.NoopPersistenceManager.runInTransaction(NoopPersistenceManager.java:131)
E/AndroidRuntime( 3934):        at com.google.firebase.database.core.SyncTree.addEventRegistration(SyncTree.java:549)
E/AndroidRuntime( 3934):        at com.google.firebase.database.core.SyncTree.keepSynced(SyncTree.java:857)
E/AndroidRuntime( 3934):        at com.google.firebase.database.core.Repo.keepSynced(Repo.java:772)
E/AndroidRuntime( 3934):        at com.google.firebase.database.core.Repo.keepSynced(Repo.java:767)
E/AndroidRuntime( 3934):        at com.google.firebase.database.Query$4.run(Query.java:267)
E/AndroidRuntime( 3934):        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:463)
E/AndroidRuntime( 3934):        at java.util.concurrent.FutureTask.run(FutureTask.java:264)
E/AndroidRuntime( 3934):        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:307)
E/AndroidRuntime( 3934):        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137)
E/AndroidRuntime( 3934):        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637)
E/AndroidRuntime( 3934):        at java.lang.Thread.run(Thread.java:1012)
E/AndroidRuntime( 3934): Caused by: java.lang.AssertionError: hardAssert failed: listen() called twice for same QuerySpec.
E/AndroidRuntime( 3934):        at com.google.firebase.database.connection.ConnectionUtils.hardAssert(ConnectionUtils.java:67)
E/AndroidRuntime( 3934):        at com.google.firebase.database.connection.PersistentConnectionImpl.listen(PersistentConnectionImpl.java:391)
E/AndroidRuntime( 3934):        at com.google.firebase.database.core.Repo$5.startListening(Repo.java:206)
E/AndroidRuntime( 3934):        at com.google.firebase.database.core.SyncTree.setupListener(SyncTree.java:918)
E/AndroidRuntime( 3934):        at com.google.firebase.database.core.SyncTree.access$1000(SyncTree.java:79)
E/AndroidRuntime( 3934):        at com.google.firebase.database.core.SyncTree$13.call(SyncTree.java:645)
E/AndroidRuntime( 3934):        at com.google.firebase.database.core.SyncTree$13.call(SyncTree.java:550)
E/AndroidRuntime( 3934):        at com.google.firebase.database.core.persistence.NoopPersistenceManager.runInTransaction(NoopPersistenceManager.java:126)

pubspec.yaml文件内容

pubspec.yaml内容

Flutter doctor输出

Flutter doctor输出


问题分析与解决办法

从错误日志核心信息listen() called twice for same QuerySpec可知,同一查询规范被重复调用监听方法,常见原因及修复方案:

  • 重复注册监听/保持同步:页面初始化时重复调用keepSynced(true)或添加相同查询监听,第二次进入未清理旧监听就再次注册。
    修复:在页面dispose方法中,移除对应查询监听或调用keepSynced(false)释放资源,确保每次进入仅初始化一次监听。
  • SDK版本存在bug:当前使用Firebase Database SDK 20.0.6,可能存在已知问题。
    修复:升级firebase_database依赖到最新稳定版,同步更新Android端Firebase SDK版本。
  • 查询对象复用不当:多次复用同一Query对象添加监听,导致重复注册。
    修复:每次进入页面创建新查询实例,或复用前检查并移除已有监听。

内容的提问来源于stack exchange,提问作者roil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:45:46