Flutter:解决了执行updateData时发生的错误,NOT_FOUND:没有要更新的文档

如何解决Flutter:解决了执行updateData时发生的错误,NOT_FOUND:没有要更新的文档

尝试更新Firebase数据库中的userData时出现以下错误

E/flutter ( 4756): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: PlatformException(Error performing updateData,NOT_FOUND: No document to update: projects/(DBname)/databases/(default)/documents/userData/ckua6TCjc2Dx76W6efuV,null)

这是我的UserData模型类

class UserData {
//  String userId;
  String id;
  String firstName;
  String lastName;
  String phoneNumber;
  String role;
  String streetAddress;
  String city;
  String state;
  String postcode;
  String country;
  Timestamp createdAt;
  Timestamp updatedAt;

  UserData();

  UserData.fromMap(Map<String,dynamic> data) {
    id = data['id'];
//    userId = data['user_id'];
    firstName = data['first_name'];
    lastName = data['last_name'];
    phoneNumber = data['phone_number'];
    role = data['role'];
    streetAddress = data['street_address'];
    city = data['city'];
    postcode = data['postcode'];
    state = data['state'];
    country = data['country'];
    createdAt = data['created_at'];
    updatedAt = data['updated_at'];
  }

  Map<String,dynamic> toMap() {
    return {
      'id': id,//      'user_id': userId,'first_name': firstName,'last_name': lastName,'phone_number': phoneNumber,'role': role,'street_address': streetAddress,'city': city,'postcode': postcode,'state': state,'country': country,'created_at': createdAt,'updated_at': updatedAt,};
  }
}

这是我的UserDataNotifier类

class UserDataNotifier with ChangeNotifier {
  UserData _loggedInUserData;

  Query userDataCollection = Firestore.instance.collection('userData');

  UserData get loggedInUserData => _loggedInUserData;

  set loggedInUserData(UserData userData) {
    _loggedInUserData = userData;
    notifyListeners();
  }

  getUserData(UserDataNotifier userDataNotifier) async {
    await userDataCollection
        .orderBy('created_at',descending: true)
        .getDocuments();
    notifyListeners();
  }

  Future updateUserData(UserData userData,bool isUpdating) async {
    CollectionReference userDataRef =
        await Firestore.instance.collection('userData');

    if (isUpdating) {
      userData.updatedAt = Timestamp.now();
      await userDataRef.document(userData.id).updateData(userData.toMap());
      print('updated userdata with id: ${userData.id}');
    } else {
      userData.createdAt = Timestamp.now();

      DocumentReference documentReference =
          await userDataRef.add(userData.toMap());

      userData.id = documentReference.documentID;

      print('created userdata successfully with id: ${userData.id}');

      await documentReference.setData(userData.toMap(),merge: true);
    }
    notifyListeners();
  }
}

这是我的编辑个人资料屏幕,可以调用我的userNotifier

class ProfileFormScreen extends StatefulWidget {
  static const String id = 'profile_form';

  @override
  _ProfileFormScreenState createState() => _ProfileFormScreenState();
}

class _ProfileFormScreenState extends State<ProfileFormScreen> {
  final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
  UserData _userData;

  //global declarations
  String selectedBusinessTypeDropDownValue = 'Fashion';
  String selectedCurrencyDropDownValue = 'NGN: Nigerian Naira';
  String selectedCountryDropDownValue = 'Nigeria';
  String email;

  _saveUserData(BuildContext context) {
    UserDataNotifier userNotifier =
        Provider.of<UserDataNotifier>(context,listen: false);

    if (!_formKey.currentState.validate()) {
      return;
    }
    _formKey.currentState.save();
    userNotifier.updateUserData(_userData,true);
    Navigator.pop(context);
  }

  @override
  void initState() {
    super.initState();

    UserDataNotifier userDataNotifier =
        Provider.of<UserDataNotifier>(context,listen: false);

    if (userDataNotifier.loggedInUserData != null) {
      _userData = userDataNotifier.loggedInUserData;
    } else {
      _userData = UserData();
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Edit Profile'),),body: SingleChildScrollView(
        padding: EdgeInsets.only(top: 20.0),child: Form(
          autovalidate: true,key: _formKey,child: Column(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,crossAxisAlignment: CrossAxisAlignment.start,children: <Widget>[
              LabelTextPadding(text: 'Business Information'),//business name
              RegularTextPadding(regText: 'Business Name'),_buildBusinessName(),//business type
              RegularTextPadding(regText: 'Business Type'),_buildBusinessType(),//Trading currency
              RegularTextPadding(regText: 'Trading Currency'),_buildTradingCurrency(),//business location
              RegularTextPadding(regText: 'Location'),//address 1
              _buildAddress(),//city
              _buildCityField(),//postcode
              _buildPostcode(),//state
              _buildStateField(),//country
              _buildCountry(),SizedBox(
                height: 20.0,DividerClass(),//Personal information
              LabelTextPadding(
                text: 'Personal Information',_buildFirstNameField(),_buildLastNameField(),_buildPhoneNumberField(),//              _buildEmailField(),_buildButtons(),],);
  }

  _buildBusinessName() {
    if (_userData.businessName == null) {
      return PaddedInputTextFormField(
        hintText: 'update business name',onSaved: (value) {
          _userData.businessName = value;
        },);
    } else {
      return PaddedInputTextFormField(
        inputValue: _userData.businessName,);
    }
  }

  _buildBusinessType() {
    return Padding(
      padding: const EdgeInsets.all(20.0),child: DropdownButton(
        value: _userData.businessType == null
            ? selectedBusinessTypeDropDownValue
            : _userData.businessType,icon: Icon(FontAwesomeIcons.caretDown),elevation: 15,underline: Container(
          height: 2,color: kThemeStyleButtonFillColour,items: businessType
            .map(
              (businessType) => DropdownMenuItem(
                  value: businessType,child: Text(businessType)),)
            .toList(),onChanged: (newValue) {
          setState(() {
            selectedBusinessTypeDropDownValue = newValue;
            _userData.businessType = newValue;
          });
        },);
  }

  _buildTradingCurrency() {
    return Padding(
      padding: const EdgeInsets.all(20.0),child: DropdownButton(
        value: _userData.tradingCurrency == null
            ? selectedCurrencyDropDownValue
            : _userData.tradingCurrency,items: tradingCurrency
            .map(
              (tradingCurrency) => DropdownMenuItem(
                  value: tradingCurrency,child: Text(tradingCurrency)),onChanged: (newValue) {
          setState(() {
            selectedCurrencyDropDownValue = newValue;
            _userData.tradingCurrency = newValue;
          });
        },);
  }

  _buildAddress() {
    if (_userData.streetAddress == null) {
      return PaddedInputTextFormField(
        hintText: 'address 1',onSaved: (value) {
          _userData.streetAddress = value;
        },);
    } else {
      return PaddedInputTextFormField(
        inputValue: _userData.streetAddress,);
    }
  }

  _buildCityField() {
    if (_userData.city == null) {
      return PaddedInputTextFormField(
        hintText: 'update city',onSaved: (value) {
          _userData.city = value;
        },);
    } else {
      return PaddedInputTextFormField(
        inputValue: _userData.city,);
    }
  }

  _buildPostcode() {
    if (_userData.postcode == null) {
      return PaddedInputTextFormField(
        hintText: 'update postcode',onSaved: (value) {
          _userData.postcode = value;
        },);
    } else {
      return PaddedInputTextFormField(
        inputValue: _userData.postcode,);
    }
  }

  _buildStateField() {
    if (_userData.state == null) {
      return PaddedInputTextFormField(
        hintText: 'update state',onSaved: (value) {
          _userData.state = value;
        },);
    } else {
      return PaddedInputTextFormField(
        inputValue: _userData.state,);
    }
  }

  _buildCountry() {
    return Padding(
      padding: const EdgeInsets.all(20.0),child: DropdownButton(
        value: _userData.country == null
            ? selectedCountryDropDownValue
            : _userData.country,items: country
            .map(
              (country) =>
                  DropdownMenuItem(value: country,child: Text(country)),onChanged: (newValue) {
          setState(() {
            selectedCountryDropDownValue = newValue;
            _userData.country = newValue;
          });
        },);
  }

  //user personal info build
  _buildFirstNameField() {
    if (_userData.firstName == null) {
      return PaddedInputTextFormField(
        hintText: 'update first name',onSaved: (value) {
          _userData.firstName = value;
        },);
    } else {
      return PaddedInputTextFormField(
        inputValue: _userData.firstName,);
    }
  }

  _buildLastNameField() {
    if (_userData.lastName == null) {
      return PaddedInputTextFormField(
        hintText: 'update last name',onSaved: (value) {
          _userData.lastName = value;
        },);
    } else {
      return PaddedInputTextFormField(
        inputValue: _userData.lastName,);
    }
  }

  _buildPhoneNumberField() {
    if (_userData.phoneNumber == null) {
      return PaddedInputTextFormField(
        hintText: 'update phone number',onSaved: (value) {
          _userData.phoneNumber = value;
        },);
    }
  }

  //build email form field
  _buildEmailField() {
    FutureBuilder<String>(
      future: AuthProvider.of(context).auth.getCurrentUserEmail(),// ignore: missing_return
      builder: (BuildContext context,AsyncSnapshot<String> snapshot) {
        return PaddedEmailInputTextField(
          emailInput: snapshot.data,onSaved: (value) => email = value,);
      },);
  }

  _buildButtons() {
    return Padding(
      padding: const EdgeInsets.fromLTRB(15.0,10.0,15.0,10.0),child: Row(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: <Widget>[
          Buttons(
              onPressedButton: () {
                Navigator.pop(context);
              },buttonLabel: 'Cancel',buttonColour: kThemeStyleButtonFillColour,buttonTextStyle: kThemeStyleButton),SizedBox(
            width: 15.0,Buttons(
              onPressedButton: () => _saveUserData(context),buttonLabel: 'Save',);
  }
}

我可能会丢失什么?我不确定如何解决我收到的错误。还看到其他在线开发人员也遇到了类似的问题,但是没有答案/线索很奏效。

谢谢。

解决方法

所以我弄清楚了为什么会出现该错误。问题是我在updateUserData()方法中将isUpating设置为true,默认情况下,当在我的应用程序中没有初始数据保存到数据库时,该值为true。

没有现有数据时,我必须使用

documentReference.setData(userData.toMap()) 

因为目前没有要更新的内容

我希望这对寻求解决方案的人有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res