调用Firebase云函数返回无效参数错误的原因排查
问题根源分析
你遇到的断言失败,核心原因是调用call()时传入的Map参数不符合_debugIsValidParameterType的校验规则——要么Map的key不是String类型,要么某个参数值的类型违规。结合你的测试情况,大概率是前者:你可能误将变量作为Map的key传入,而非字符串字面量。
比如你写的{groupID: groupID},这里的key是变量groupID的值,而非字符串'groupID'。如果groupID的值不是String(比如是int、Map或其他对象),就会触发Map key必须为String的校验失败;同理,当你传入{createdTimestamp: createdTimestamp}时,若createdTimestamp是Map类型,这个key本身就是Map对象,直接违反了key必须是String的规则。
解决方案
1. 强制使用字符串字面量作为Map的key
把参数Map里的所有key加上单/双引号,确保key是固定的字符串类型:
await FirebaseFunctions.instance.httpsCallable('callGroupRTDBSetup').call({ 'groupID': groupID, 'adminUID': adminUID, 'adminUsername': adminUsername, 'createdTimestamp': '1690519017833', });
2. 验证所有参数值的类型
确认groupID、adminUID等变量的类型是String/num/bool/null,绝对不能传入对象(比如Firebase的User、DocumentReference等)。如果是从Firebase获取的ID,要取对应的字符串属性(比如FirebaseAuth.instance.currentUser!.uid,而非currentUser对象本身)。
3. 针对Map类型的参数
如果参数值是Map(比如你后来的createdTimestamp),确保这个子Map的所有key都是String,值也符合String/num/bool/null要求(你已经通过独立测试验证过这点,只要外层Map的key是字符串就没问题):
Map<String, String> createdTimestamp = getRTDBTimestamp(); final callResult = await FirebaseFunctions.instance.httpsCallable('callGroupRTDBSetup').call({ 'createdTimestamp': createdTimestamp, // 这里key是字符串'createdTimestamp' });
验证方法
调用call()前,打印参数Map的key类型,确认都是String:
final params = { 'groupID': groupID, 'adminUID': adminUID, 'adminUsername': adminUsername, 'createdTimestamp': createdTimestamp, }; params.keys.forEach((key) => print('Key: $key, Type: ${key.runtimeType}'));
内容的提问来源于stack exchange,提问作者whatwhatwhat

