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
相关产品推荐
相关产品推荐

