等到firestore中的数据成功更新

Posted

技术标签:

【中文标题】等到firestore中的数据成功更新【英文标题】:Wait till data in firestore has successfully updated 【发布时间】:2021-11-09 13:26:14 【问题描述】:

我想在用户单击保存按钮时检查数据是否成功上传到 Firestore 如果文档没有更新,则显示 toast 或要求用户重试。

这是我更新文档的代码。

  Future updateTechnical(Technical technical) async 
    return await technicalsCollection.doc(technical.id).update(
      "name": technical.name,
      "address": technical.address,
      "phoneNum": technical.phoneNum,
      "tools": technical.tools,
    );
  

这是保存按钮

       ElevatedButton(
                onPressed: () 
                  DatabaseService().updateTechnical(
                    Technical(
                      id: selectedTechnical.id,
                      name: nameController.text,
                      address: addressController.text,
                      phoneNum: phoneController.text,
                      tools: selected.join(','),
                      
                    ),
                  );
                ,
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Text('Save  '),
                    Icon(Icons.person_add),
                  ],
                ),
              ),

【问题讨论】:

我想你正在寻找,当 firebase 更新时,对吧?在使用来自 firebase 的新数据调用 updateTechnical() 之后,您可能想要做点什么?! 是的,你是对的,当 firebase 更新后,我认为这是可行的。但是如果我想知道文档没有更新的原因(如网络连接、无效数据类型、....等)怎么办? 如果目前的答案令人满意,请务必标记最有帮助的答案,以便其他人看到接受的答案。 【参考方案1】:

要检查您的数据是否成功更新,您需要在发生错误时捕获它们。我已经修改了你的 updateTechnical() 函数来这样做:

  Future updateTechnical(Technical technical) async 
    return await technicalsCollection.doc(technical.id).update(
      "name": technical.name,
      "address": technical.address,
      "phoneNum": technical.phoneNum,
      "tools": technical.tools,
    ).then((value) => print("Updated successfully")) // success toast here
          .catchError((error) => print("Failed to update: $error")); // fail toast here
  

您也可以使用 try/catch 块,但这被认为效率较低,通常会尽可能避免

【讨论】:

【参考方案2】:

等到数据成功更新,您可以使用.then()

onPressed: () 
   DatabaseService().updateTechnical().then((value) => 
                         print("successfully uploaded!"),
                    );
,

要在上传过程中检查是否发生任何错误,您应该检查updateTechnical()

 Future updateTechnical(Technical technical) async 
    try 
      final querySnapshot =
          await technicalsCollection.doc(technical.id).update(
        "name": technical.name,
        "address": technical.address,
        "phoneNum": technical.phoneNum,
        "tools": technical.tools,
      );
      return querySnapshot;
     catch (error) 
      print(error); //here you can see the error messages from firebase
      throw 'failed';
    
  

如果您需要做某些事情,当发生特定错误时,很遗憾,您必须检查所有错误消息。这是一个例子:Handle exceptions

【讨论】:

以上是关于等到firestore中的数据成功更新的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Firestore 中一次创建/更新多个文档

Firebase/Firestore 配置文件更新不成功

使用python在Firestore中运行GeoPoint

SwiftUI - 等到 Firestore getDocuments() 完成后再继续

在 Firestore 中自动创建集合

Vuejs 和 Firestore - 如何在 Firestore 中的数据更改时进行更新