在同一位置运行Firestore交易使应用崩溃了

时间:2020-05-27 13:19:50

标签: flutter google-cloud-firestore transactions

我需要同时向Firestore数据库中的一个位置运行两个事务,但是当我实现它时会出现错误。 我正在flutter应用程序中实现Firestore交易,基本上我是在按下一个按钮时调用多个交易。我应该如何确保不会发生此错误,并且不会使我的应用程序崩溃。

下面添加的代码清楚地显示了事务的调用,并且事务配置正确,并且没有问题,所有问题都发生了,因为要在同一位置将它们同时调用。

我也在下面共享了错误日志。请指导我该怎么办。

FlatButton(
                  child: Text("btn3"),
                  onPressed: () {
                   Transaction1().postTransaction();
                    Transaction2().postTransaction();
                  },

错误日志

2020-05-27 18:43:14.529 1022-1344 / dev.jideguru.social_app_ui E / AndroidRuntime:致命例外:AsyncTask#4 流程:dev.jideguru.social_app_ui,PID:1022 java.lang.RuntimeException:执行doInBackground()时发生错误 在android.os.AsyncTask $ 3.done(AsyncTask.java:353) 在java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383) 在java.util.concurrent.FutureTask.setException(FutureTask.java:252) 在java.util.concurrent.FutureTask.run(FutureTask.java:271) 在android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:245) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:636) 在java.lang.Thread.run(Thread.java:764) 原因:java.lang.AssertionError:内部声明失败:事务对象的更新回调已被使用后,将无法使用 调用。 com.google.firebase.firestore.util.Assert.fail(com.google.firebase:firebase-firestore @@ 21.3.0:46) com.google.firebase.firestore.util.Assert.hardAssert(com.google.firebase:firebase-firestore @@ 21.3.0:31) com.google.firebase.firestore.core.Transaction.ensureCommitNotCalled(com.google.firebase:firebase-firestore @@ 21.3.0:246) com.google.firebase.firestore.core.Transaction.lookup(com.google.firebase:firebase-firestore @@ 21.3.0:81) 在com.google.firebase.firestore.Transaction.getAsync(com.google.firebase:firebase-firestore @@ 21.3.0:191) com.google.firebase.firestore.Transaction.get(com.google.firebase:firebase-firestore @@ 21.3.0:228) 在io.flutter.plugins.firebase.cloudfirestore.CloudFirestorePlugin $ 5.doInBackground(CloudFirestorePlugin.java:613) 在io.flutter.plugins.firebase.cloudfirestore.CloudFirestorePlugin $ 5.doInBackground(CloudFirestorePlugin.java:608) 在android.os.AsyncTask $ 2.call(AsyncTask.java:333) 在java.util.concurrent.FutureTask.run(FutureTask.java:266) 在android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:245) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:636) 在java.lang.Thread.run(Thread.java:764)2020-05-27 18:43:14.529 1022-1346 / dev.jideguru.social_app_ui E / AndroidRuntime: 致命异常:AsyncTask#6 流程:dev.jideguru.social_app_ui,PID:1022 java.lang.RuntimeException:执行doInBackground()时发生错误 在android.os.AsyncTask $ 3.done(AsyncTask.java:353) 在java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383) 在java.util.concurrent.FutureTask.setException(FutureTask.java:252) 在java.util.concurrent.FutureTask.run(FutureTask.java:271) 在android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:245) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:636) 在java.lang.Thread.run(Thread.java:764) 原因:java.lang.AssertionError:内部声明失败:事务对象的更新回调已被使用后,将无法使用 调用。 com.google.firebase.firestore.util.Assert.fail(com.google.firebase:firebase-firestore @@ 21.3.0:46) com.google.firebase.firestore.util.Assert.hardAssert(com.google.firebase:firebase-firestore @@ 21.3.0:31) com.google.firebase.firestore.core.Transaction.ensureCommitNotCalled(com.google.firebase:firebase-firestore @@ 21.3.0:246) com.google.firebase.firestore.core.Transaction.lookup(com.google.firebase:firebase-firestore @@ 21.3.0:81) 在com.google.firebase.firestore.Transaction.getAsync(com.google.firebase:firebase-firestore @@ 21.3.0:191) com.google.firebase.firestore.Transaction.get(com.google.firebase:firebase-firestore @@ 21.3.0:228) 在io.flutter.plugins.firebase.cloudfirestore.CloudFirestorePlugin $ 5.doInBackground(CloudFirestorePlugin.java:613) 在io.flutter.plugins.firebase.cloudfirestore.CloudFirestorePlugin $ 5.doInBackground(CloudFirestorePlugin.java:608) 在android.os.AsyncTask $ 2.call(AsyncTask.java:333) 在java.util.concurrent.FutureTask.run(FutureTask.java:266) 在android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:245) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:636) 在java.lang.Thread.run(Thread.java:764)

1 个答案:

答案 0 :(得分:2)

尝试在第一个事务之前使用async方法和await关键字,以在开始第二个事务之前等待。