首页 > 解决方案 > 如何在发送到 Firebase 之前验证数据 - Flutter

问题描述

我需要验证数据是否成功发送到Firebase,我有一个Field增量值,在用户的列表中,并且每次用户提交答案时该字段都会增加,但是问题是,即使答案是空的如果我点击 addAnswer 按钮,则增量正在发生,我希望仅在成功提交答案时更新增量计数器。

增量未来方法

Future answerCounter(BuildContext context, String userID,)async{
return FirebaseFirestore.instance.collection('users').doc(userID).update({
  'answercounter': FieldValue.increment(1),
});
}

添加答案和答案计数器的代码

answerAdder(BuildContext context,
  AsyncSnapshot<DocumentSnapshot> documentSnapshot, String QuesID) {
return showModalBottomSheet(
    elevation: 0,
    backgroundColor: Colors.transparent,
    isScrollControlled: true,
    context: context,
    builder: (context) {
      return Container(
        height: MediaQuery.of(context).size.height * 0.8,
        width: MediaQuery.of(context).size.width,
        margin: EdgeInsets.symmetric(horizontal: 5),
        decoration: BoxDecoration(
          color: constantColors.white,
          borderRadius: BorderRadius.only(
              topRight: Radius.circular(25), topLeft: Radius.circular(25)),
        ),
        child: Column(
          children: [
            Divider(
              indent: 110,
              endIndent: 110,
              thickness: 4,
              color: Colors.grey,
            ),
            Padding(
              padding: const EdgeInsets.all(5.0),
              child: Row(
                mainAxisAlignment: MainAxisAlignment.end,
                crossAxisAlignment: CrossAxisAlignment.center,
                children: [
                  MaterialButton(
                    onPressed: () {
                      Provider.of<PostFunctions>(context, listen: false)
                          .addAnswer(
                              context,
                              documentSnapshot.data.data()['question id'],
                              answerController.text,
                              titleController.text)
                          .whenComplete(() {
                        Navigator.pop(context);
                            print('adding counter');
                       if(documentSnapshot.hasData){
                         return  Provider.of<PostFunctions>(context, listen: false)
                             .answerCounter(context, Provider.of<Authentication>(context,listen: false).getUserUid);
                       } else {
                         print('error');
                       }
                      });
                      Navigator.pop(context);
                    },

标签: firebasefluttergoogle-cloud-firestore

解决方案


您的代码中的问题是documentSnapshot.hasData()始终返回 true。名称可能有点混乱,但hasData()仅检查内容是否不为 null。这就是为什么它总是更新计数器。如果您更改该部分,请添加以下内容:

 if(snapshot.hasData() && snapshot.data.exists()) {}

或者

if (snapshot.data?.exists ?? false) {}

其中任何一个都应该起作用,并且仅在数据确实包含文档时才更新计数器。


推荐阅读