Flutter中FirebaseDatabase执行事务崩溃,求解决方案
解决Flutter Firebase Realtime Database事务的主线程错误
从报错信息能看出核心问题:FirebaseDatabaseWorker线程执行了必须在主线程运行的@UiThread方法,这是因为你给runTransaction的回调加了async修饰符导致的。
问题根源
Firebase Realtime Database的事务回调是设计为同步执行的,当你给回调函数加上async后,它会被包装成Future,执行逻辑会被调度到后台线程,而Flutter与Firebase插件的部分通信逻辑必须在主线程完成,这就触发了线程不匹配的错误。
修正后的代码
你的逻辑只是同步修改数值,完全不需要异步,去掉async关键字即可:
ref.runTransaction((MutableData transaction) { transaction.value = (transaction.value ?? 0) + 1; return transaction; });
额外说明
如果你的事务逻辑确实需要异步操作(比如先调用其他异步API再修改数值),那需要确保异步逻辑在主线程执行,可借助WidgetsBinding来处理:
ref.runTransaction((MutableData transaction) { final currentValue = transaction.value ?? 0; WidgetsBinding.instance.addPostFrameCallback((_) async { // 这里执行你的异步逻辑 final newValue = await someAsyncOperation(currentValue); // 重新触发事务或直接更新 ref.set(newValue); }); transaction.value = currentValue; return transaction; });
不过这种场景要注意并发冲突,优先用同步逻辑处理事务会更稳妥。
内容的提问来源于stack exchange,提问作者Jorge Vieira
相关产品推荐
相关产品推荐

