如何修复颤振中的“回复已提交的错误”?

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”错误

如何修复颤振中的“未处理的异常:用于空值的空检查运算符”错误?

如何修复颤振中的“终止原因:命名空间代码设计,代码 0x2”错误?

尝试归档没有剩余磁盘空间的颤振项目,无法修复错误

如何修复颤振 lib/main.dart 错误

升级我的颤振后如何修复以下错误