FlutterFlow自定义函数无法返回Firestore文档int值问题
解决Firestore求和时的Future类型不匹配错误
报错的核心原因是Firestore的get()方法是异步操作,返回Future类型,但你的函数声明返回int,类型完全不匹配。这和Firestore存储的num类型无关,是异步逻辑处理的问题。
修改步骤
- 调整函数签名:将返回类型改为
Future<int>,并添加async关键字——异步函数必须返回Future类型。 - 重构异步逻辑:用
async/await替代then()链式调用,代码更易读且符合Dart异步规范。 - 安全处理字段转换:兼容Firestore可能存储的num类型,确保
itemQty安全转为int。 - 优化错误处理:用
try-catch捕获异常,返回合理默认值(如0)。
修改后的完整代码
import 'dart:convert'; import 'dart:math' as math; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:intl/intl.dart'; import 'package:timeago/timeago.dart' as timeago; import '/flutter_flow/lat_lng.dart'; import '/flutter_flow/place.dart'; import '/flutter_flow/uploaded_file.dart'; import '/flutter_flow/custom_functions.dart'; import '/backend/backend.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import '/backend/schema/structs/index.dart'; import '/auth/firebase_auth/auth_util.dart'; Future<int> calculateTotalItemQty( String? itemId, String? businessId, ) async { /// MODIFY CODE ONLY BELOW THIS LINE try { // 获取符合条件的文档快照 final querySnapshot = await FirebaseFirestore.instance .collection('purchases') .where('itemId', isEqualTo: itemId) .where('businessId', isEqualTo: businessId) .get(); int totalQty = 0; for (final doc in querySnapshot.docs) { // 安全转换itemQty:兼容Firestore的num类型存储,为空时默认0 final num qty = doc['itemQty'] ?? 0; totalQty += qty.toInt(); } return totalQty; } catch (error) { print('Error getting total item qty: $error'); // 出错时返回0,也可根据需求抛出异常 return 0; } /// MODIFY CODE ONLY ABOVE THIS LINE }
调用方式
因为函数现在是异步的,调用时必须使用await(在异步函数内)或.then():
// 异步函数内调用 void loadTotalQty() async { int total = await calculateTotalItemQty('your_item_id', 'your_business_id'); print(total); } // 或用then链式调用 calculateTotalItemQty('your_item_id', 'your_business_id') .then((total) => print(total)) .catchError((e) => print(e));
内容的提问来源于stack exchange,提问作者Mike Yates
相关产品推荐
相关产品推荐

