【问题标题】:How to conditionally update data in Cloud Firestore?如何有条件地更新 Cloud Firestore 中的数据?
【发布时间】:2019-09-14 07:31:16
【问题描述】:

我的应用中有一个设置页面,用户可以对其进行编辑以更新详细信息。数据屏幕由两个两个文本字段和一个配置文件头像组成。该应用程序将谷歌(和电子邮件和密码)作为身份验证提供者。因此,当用户第一次注册时,我有一种方法可以将数据呈现给用户。

void readLocal() async {

    controllerName = new TextEditingController(text: AuthProvider.of(context).userData.name);
    print(controllerName);
    controllerEmail = new TextEditingController(text: AuthProvider.of(context).userData.email);
    avatarUrl= AuthProvider.of(context).userData.avatarUrl;
   // controllerPhoneNumber= new TextEditingController(text: AuthProvider.of(context).userData.phoneNumber);

    // Force refresh input
    setState(() {});
  }

数据按预期呈现。该方法在

中调用
 @override
  void didChangeDependencies() {
    readLocal();

  }

确保 initState 已完成。我有一个更新按钮,它的行为不像我想要的那样。当我编辑两个字段时:两个字段都更新并且正确的写入都发送到 Firestore。但是,如果我更新一个TextField,然后按更新,我会丢失另一个TextField 中的数据(将一个空字符串写入Firestore),反之亦然。如果我在不编辑任何一个字段的情况下按下更新,Firestore 中的两个字段都会以空字符串结束。这是我的更新功能

void handleUpdateData() {
    focusName.unfocus();
    focusEmail.unfocus();


    setState(() {
      isLoading = true;
    });
    AuthProvider.of(context).userData.docRef.updateData({'name': name, 'email': email,'avatarUrl':avatarUrl}).then((data) async{
      print('@@@@@@@@@@@@@@@@@@@@@@@@@@@               @@@@@@@@@@@@@@@@@@@@@@@@@@@@@');
      setState(() {
        isLoading = false;
      });

      Fluttertoast.showToast(msg: "Update success");
    }).catchError((err) {
      setState(() {
        isLoading = false;
      });

      Fluttertoast.showToast(msg: err.toString());
    });
  }

这是gist 飞镖文件。我假设通过不编辑字段然后按下更新按钮,更新函数需要一个空字符串来更新并将其写入 Firestore。如何防止这种情况发生?

【问题讨论】:

    标签: flutter google-cloud-firestore


    【解决方案1】:

    如果您告诉 Firestore 将某个字段设置为空字符串,它会将该字段设置为空字符串。如果您不希望 Firestore 修改某个字段,则不应在对 updateDate(...) 的调用中指定该字段。

    实际上,这意味着您需要有条件地填充值的Map,如下所示:

    Map<String, dynamic> values = new Map<String,dynamic>();
    if (name?.isEmpty ?? true) values["name"] = name;
    if (email?.isEmpty ?? true) values["email"] = email;
    if (avatarUrl?.isEmpty ?? true) values["avatarUrl"] = avatarUrl;
    
    AuthProvider.of(context).userData.docRef.updateData(values).then((data) async{
      ...
    

    空字符串检查逻辑见Dart null / false / empty checking: How to write this shorter?

    【讨论】:

    • 感谢条件 Map,但它仍在 Firestore 中设置空白字段
    • 你自己调试的吗?也许name?.isEmpty ?? true 需要有点不同才能了解您的情况。
    猜你喜欢
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    相关资源
    最近更新 更多