如何修复颤振中的“回复已提交的错误”?
Posted
技术标签:
【中文标题】如何修复颤振中的“回复已提交的错误”?【英文标题】:How to fix 'Reply already submitted error' in flutter? 【发布时间】:2019-11-27 07:08:44 【问题描述】:我正在使用颤振 v1.7.8+hotfix.3。我正在创建新用户并将他们的详细信息添加到 firestore 数据库中。当我第一次添加用户时,它工作正常。当我尝试添加另一个新用户时,我收到以下错误并且应用程序崩溃:
E/CloudFirestorePlugin(11070):等待任务超时 E/CloudFirestorePlugin(11070): java.util.concurrent.TimeoutException: 等待任务 E/CloudFirestorePlugin(11070) 超时:在
com.google.android.gms.tasks.Tasks.await(Unknown Source:32) E/CloudFirestorePlugin(11070): at io.flutter.plugins.firebase.cloudfirestore.CloudFirestorePlugin$4.apply(Cl>oudFirestorePlugin.java:409) E/CloudFirestorePlugin(11070):在 io.flutter.plugins.firebase.cloudfirestore.CloudFirestorePlugin$4.apply(Cl>oudFirestorePlugin.java:361) E/CloudFirestorePlugin(11070):在 com.google.firebase.firestore.FirebaseFirestore.lambda$runTransaction$1(co>m.google.firebase:firebase-firestore@@19.0.0:283) E/CloudFirestorePlugin(11070):在 com.google.firebase.firestore.FirebaseFirestore$$Lambda$3.call(未知 来源:6)E/CloudFirestorePlugin(11070):在>com.google.android.gms.tasks.zzv.run(未知来源:2)E/CloudFirestorePlugin(11070):在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:>1167) E/CloudFirestorePlugin(11070):在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java>:641) E/CloudFirestorePlugin(11070):在 java.lang.Thread.run(Thread.java:764) D/AndroidRuntime(11070): 关闭 VM E/AndroidRuntime(11070): 致命异常: main E/AndroidRuntime(11070):进程:com.example.task_manager,PID:11070 E/AndroidRuntime(11070): java.lang.IllegalStateException: 回复 已经>提交 E/AndroidRuntime(11070): at io.flutter.embedding.engine.dart.DartMessenger$Reply.reply(DartMessenger.j>ava:135) E/AndroidRuntime(11070):在 io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler$1.error(M>ethodChannel.java:230) E/AndroidRuntime(11070):在 io.flutter.plugins.firebase.cloudfirestore.CloudFirestorePlugin$3.onComple>te(CloudFirestorePlugin.java:427) E/AndroidRuntime(11070):在 com.google.android.gms.tasks.zzj.run(Unknown Source:4) E/AndroidRuntime(11070): at android.os.Handler.handleCallback(Handler.java:873) E/AndroidRuntime(11070): 在 android.os.Handler.dispatchMessage(Handler.java:99) E/AndroidRuntime(11070): 在 android.os.Looper.loop(Looper.java:193) E/AndroidRuntime(11070):在 android.app.ActivityThread.main(ActivityThread.java:6669) E/AndroidRuntime(11070): 在 java.lang.reflect.Method.invoke(Native 方法) E/AndroidRuntime(11070): at >com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.ja>va:493) E/AndroidRuntime(11070):在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) I/Process (11070):发送信号。 PID:11070 SIG:9 应用 完成了。
我正在使用以下代码添加新用户:
_sendToServer()
if (_formKey.currentState.validate())
//No error in validator
_formKey.currentState.save();
Firestore.instance.runTransaction((Transaction transaction) async
DocumentReference reference =
Firestore.instance.collection('Users').document(_name);
await transaction.get(reference);
await reference.setData(
"Name": "$_name",
"Email": "$_email",
"Password": "$_password",
"status": "new",
"clientName": widget.title
);
);
registerUser();
registerUser() async
String userId =
await widget.auth.createUserWithEmailAndPassword(_email, _password);
if (_formKey.currentState.validate())
//No error in validator
_formKey.currentState.save();
Firestore.instance.runTransaction((Transaction transaction) async
DocumentReference reference =
Firestore.instance.collection('UserRoles').document(_name);
await transaction.get(reference);
await reference
.setData("userid": "$userId", "role": "user", "status": "new");
);
Navigator.pop(context);
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => AdminPage(
auth: widget.auth,
onSignedOut: widget.onSignedOut,
title: widget.title,
)));
我尝试过使用颤振清洁。但它只能使用一次。
任何帮助将不胜感激!
【问题讨论】:
【参考方案1】:根据bug 的检查,该问题应该已经在 cloud_firestore 的当前版本(撰写本文时为 2.5.3)时得到修复。这个问题以前可以通过订阅 DocumentReference 的快照来重现。
【讨论】:
以上是关于如何修复颤振中的“回复已提交的错误”?的主要内容,如果未能解决你的问题,请参考以下文章
如何修复颤振中的“SocketException:OS错误:连接超时,errno = 110,地址= 192.168.5.10,端口= 49590”错误
如何修复颤振中的“未处理的异常:用于空值的空检查运算符”错误?