Несколько транзакций приводят к сбою одного и того же документа в пожарном хранилище flutter - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь реализовать несколько транзакций с одним и тем же документом в приложении flutter, которое использует firestore в качестве своей базы данных, но это приводит к сбою приложения. То же самое, когда это было реализовано в собственных приложениях Xcode или android studio, эта проблема не возникала ни разу.

Есть ли руководство, как сделать несколько транзакций успешными в flutter firestore.

Например, если более 1 пользователя с разных устройств совершают транзакцию с одним и тем же документом в одно и то же время, транзакция завершается неудачно, и приложение вылетает.

Как это можно решить?

Firestore.instance.runTransaction((Transaction tx) async {
      DocumentSnapshot postSnapshot = await tx.get(docRef);
      if (postSnapshot.exists) {
        await tx.update(docRef, <String, dynamic>{'likes': postSnapshot.data['likes'] + 1});
       // print("transaction completed");
      }
    })

ЖУРНАЛЫ ОШИБОК

2020-05-27 18: 43: 14.529 1022-1344 / dev.jideguru.social_app_ui E / Android Время выполнения: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: 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 .rentutil.concur .ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor. java: 636) в java .lang.Thread.run (Thread. java: 764) Вызвано: java .lang.AssertionError: СБОЙ ВНУТРЕННЕГО УТВЕРЖДЕНИЯ: A объект транзакции нельзя использовать после того, как был вызван его обратный вызов обновления. на 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.getAsyn c (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. android: 2. (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 () в * 1056c * .os. $ 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 (T hreadPoolExecutor. java: 636) at 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.getAsyn c (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 (CloudFirestore * 1074Plugin. *: 613) в io.flutter.plugins.firebase.cloudfirestore.CloudFirestorePlugin $ 5.doInBackground (CloudFirestorePlugin. java: 608) в android .os.AsyncTask $ 2.call (AsyncTask. java: 333) в 1078 * .util.concurrent.FutureTask.run (FutureTask. java: 266) в android .os.AsyncTask $ SerialExecuto r $ 1.run (AsyncTask. java: 245) в java .util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor. java: 1162) в java .util.concurrent.ThreadPoolExecutor $ WorkerPool.run . java: 636) на java .lang.Thread.run (Thread. java: 764)

Ссылка на выпуск

1 Ответ

1 голос
/ 28 мая 2020

Вызвано: java .lang.AssertionError: СБОЙ ВНУТРЕННЕЙ АССЕРЦИИ: объект транзакции не может быть использован после вызова его обратного вызова обновления.

Похоже, что транзакция используется после его фиксации / отмены.

Это известная проблема в библиотеке FlutterFire, как описано в этой проблеме в репозитории с открытым исходным кодом.

Там - это обходной путь, упомянутый в этом комментарии . Так что вы можете попробовать применить это к своему делу, предложить PR, который исправит ошибку, или подождать, пока кто-то другой исправит ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...