【问题标题】:How to use transaction with int data - Firestore Flutter如何将事务与 int 数据一起使用 - Firestore Flutter
【发布时间】:2023-03-26 00:55:01
【问题描述】:

创建帐户后,用户的 Firestore 会创建一个字段,显示用户当前拥有的塑料数量。到目前为止,我有一个按钮可以使用用户的文本字段输入来更新该金额。我听说过一种叫做交易的东西,它显然允许一个人将输入金额添加到整体数据中以便显示?当用户输入新数量时,我将如何完成此操作?

代码:

database.dart


Future<void> userSetup(String displayName) async {
  int plastics = 0;
  final CollectionReference users =
      FirebaseFirestore.instance.collection('UserNames');
  FirebaseAuth auth = FirebaseAuth.instance;
  String uid = auth.currentUser.uid.toString();
  users.doc(uid).set({'displayName': displayName, 'uid': uid});

//This is the field for plastics amount starting at 0.
  users.doc(uid).update({'plastics': plastics});
  return;
}

我如何检索金额数据:


final firestore = FirebaseFirestore.instance;
    FirebaseAuth auth = FirebaseAuth.instance;
    Future<String> getPlasticNum() async {
      final CollectionReference users = firestore.collection('UserNames');

      final String uid = auth.currentUser.uid;

      final result = await users.doc(uid).get();

      return result.data()['plastics'].toString();
    }


我如何显示它:


FutureBuilder(
          future: getPlasticNum(),
          builder: (_, AsyncSnapshot snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting) {
              return Center(child: CircularProgressIndicator());
            }
            return Text(snapshot.data,
                style: TextStyle(color: Colors.amber[400], fontSize: 20));
          },
        ),

目前用户如何替换金额,但不能添加(问题)


OnPressed: () async {
                    try {
                      final String uid = auth.currentUser.uid;
                      FirebaseFirestore.instance
                          .collection('UserNames')
                          .doc(uid)
                          .update({
                        "plastics": int.parse(_plasticController.text),
                      });
                      Navigator.of(context).pop();
                    } catch (e) {}
                  },

【问题讨论】:

    标签: firebase flutter google-cloud-firestore


    【解决方案1】:

    我做了一个单独的未来来处理添加:

    final firestore = FirebaseFirestore.instance; //
    FirebaseAuth auth = FirebaseAuth.instance;
    
    Future<bool> addPlastic(String amount) async {
      try {
        String uid = auth.currentUser.uid;
        var value = double.parse(amount);
        DocumentReference documentReference =
            FirebaseFirestore.instance.collection('UserNames').doc(uid);
    
        FirebaseFirestore.instance.runTransaction((transaction) async {
          DocumentSnapshot snapshot = await transaction.get(documentReference);
          if (!snapshot.exists) {
            documentReference.set({'plastics': value});
            return true;
          }
          double newAmount = snapshot.data()['plastics'] + value;
          transaction.update(documentReference, {'plastics': newAmount});
          return true;
        });
      } catch (e) {
        return false;
      }
    }
    
    

    然后我只是在按下按钮时调用它

    onPressed(){
    addPlastics(_plasticController.text);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-10
      • 1970-01-01
      • 2017-10-23
      • 2011-03-04
      • 2022-11-09
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      相关资源
      最近更新 更多