我需要同时向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)
答案 0 :(得分:2)
尝试在第一个事务之前使用async
方法和await
关键字,以在开始第二个事务之前等待。