You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter平台交易函数报错:Set无法赋值给Map<String, dynamic>

解决Firestore交易中Set无法赋值给Map的错误

你在编写通过交易方法向Firestore添加金币的函数时遇到错误,错误提示为参数类型'Set'无法赋值给参数类型'Map<String, dynamic>',报错出现在transaction.update代码行。

错误原因

这行代码里你用了=而非:来定义键值对,导致语法错误,代码被解析成了Set类型,而Firestore的update方法要求传入Map<String, dynamic>类型的参数。此外代码还有几处细节问题需要修正:

修正后的完整代码

// 用交易方法添加金币的函数
Future<bool> addCoin(String id, String amount) async {
  try {
    String uid = FirebaseAuth.instance.currentUser!.uid;
    var value = double.parse(amount);
    DocumentReference documentReference = FirebaseFirestore.instance
        .collection("users")
        .doc(uid)
        .collection("coins")
        .doc(id);
    
    // 等待交易完成,避免提前返回结果
    await FirebaseFirestore.instance.runTransaction((transaction) async {
      DocumentSnapshot snapshot = await transaction.get(documentReference);
      if (!snapshot.exists) {
        // 用transaction的set方法,确保操作纳入事务管理
        transaction.set(documentReference, {'Amount': value});
        return true;
      }
      // 直接获取字段值,无需调用data()
      double currentAmount = snapshot['Amount'] as double;
      double newAmount = currentAmount + value;
      // 修正Map键值对写法,用:替代=
      transaction.update(documentReference, {'Amount': newAmount});
      return true;
    });

    return true;
  } catch (e) {
    print(e); // 打印错误便于调试
    return false;
  }
}

关键修正点

  • 将transaction.update中的{'Amount' = newAmount}改为{'Amount': newAmount},正确构建Map参数。
  • 移除snapshot['Amount'].data()的错误调用,snapshot['Amount']直接返回字段值,可通过as double做类型转换。
  • 给runTransaction添加await,确保函数等待交易完成后再返回结果。
  • 替换documentReference.set为transaction.set,让新增文档的操作也纳入事务管理,保证数据一致性。

内容的提问来源于stack exchange,提问作者Chinmay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 02:01:03