代码之家  ›  专栏  ›  技术社区  ›  dablur

Firebase runTransaction()在Dart中键入

  •  0
  • dablur  · 技术社区  · 2 年前

    我正在寻求在dart中键入Firebase实时数据库事务的帮助。

    具体来说,我正在尝试通过firebase的示例事务代码

      void transactions_updatingDataWithTransactions() {
        // [START transactions_updating_data_with_transactions]
        final sfDocRef = db.collection("cities").doc("SF");
        db.runTransaction((transactionObj) async {
          final snapshot = await transactionObj.get(sfDocRef);
          final newPopulation = snapshot.get("population") + 1;
          transactionObj.update(sfDocRef, {"population": newPopulation});
        }).then(
          (value) => print("DocumentSnapshot successfully updated!"),
          onError: (e) => print("Error updating document $e"),
        );
      }
    

    该问题源于db.runTransaction()的参数is Transaction Function(Object?)transactionHandler

    在上面的例子中,transactionObj就是对象。当尝试执行任何操作时,例如

          final snapshot = await transactionObj.get(sfDocRef);
    

    我收到了未为Object?定义“get”的错误?。我该如何避开打字?

    RTDB文档中没有flutter代码,请参阅 here

    Firestore的文档就是我所依据的 here 因为我找不到任何与实时数据库相关的文档

    0 回复  |  直到 2 年前
        1
  •  1
  •   Hasan koç    2 年前

    实时数据库信号

    /// spariş numarasını getirir
    
    
    Future<int> getSpNo() async {
        var no = 0;
        await _instence
            .ref(AppDatabaseReferance.sparisNo.value)
            .runTransaction((transaction) {
          no = transaction as int? ?? 0;
          final value = (transaction ?? 0) + 1;
          return Transaction.success(value);
        });
        return no;
      }
    
        2
  •  0
  •   Frank van Puffelen    2 年前

    如果你看看 reference documentation for Transaction 有一个 get() 方法但错误消息表明编译器认为 transactionObj 属于类型 Object? ,这意味着它不知道自己的方法。

    可以通过指定的类型来解决此问题 事务对象 在您的代码中。如果我没有记错的话,应该是这样的:

    db.runTransaction((transactionObj: Transaction) async {
    

    或者,您可以铸造 事务对象 到回调中的正确类型,使用:

    db.runTransaction((transactionObj) async {
      final transaction = transactionObj as Transaction;
    

    问题中的代码(例如。 db.collection("cities").doc("SF"); )用于Cloud Firestore。如果你没有使用Firestore,听起来你试图使用错误的API。

    要了解实时数据库的事务API,请参阅: https://firebase.google.com/docs/database/flutter/read-and-write#save_data_as_transactions