Flutter中QueryParameters Map键值访问方法及Uri.https()类型不匹配异常排查咨询
解决QueryParameters类型不匹配的异常问题
嘿,我一眼就揪出你代码里的问题了——就是这个三元表达式搞的鬼:
final filterString = filterByUser ? _params : _params['auth'];
问题根源
这里的核心矛盾是类型不兼容:三元运算符要求左右两边的返回类型必须一致,但左边的_params是Map<String, String>类型,右边的_params['auth']是String?类型。这就导致filterString的类型被推断成了Object,而Uri.https()的第三个参数明确要求是Map<String, String>?,把一个Object塞进去,可不就抛出type 'String' is not a subtype of type 'Map<String, dynamic>?'的异常嘛!
你的需求拆解
看起来你是想实现:
- 当
filterByUser为true时,用完整的查询参数(包含auth、orderBy、equalTo) - 当
filterByUser为false时,只传auth这一个参数
那你得保证两边都返回Map类型,而不是一边是Map一边是字符串。
修正方案
方案一:直接构造新的Map(最简洁)
既然authToken是你已经有的变量,直接用它构造一个只包含auth的新Map就行,还能避免从_params取值可能出现的null问题:
Future fetchAndSetProducts([bool filterByUser = false]) async { final _params = <String, String>{ 'auth': authToken, 'orderBy': 'creatorId', // 这里不需要json.encode,直接传字符串就行 'equalTo': userId, // 同理,Firebase查询参数不需要编码 }; final filterString = filterByUser ? _params : {'auth': authToken}; var url = Uri.https('demo1-102d7-default-rtdb.asia-southeast1.firebasedatabase.app', '/products.json', filterString); // 后续请求逻辑... }
方案二:处理authToken可能为null的情况
如果authToken有可能是null,那可以加一层空判断,避免构造出值为null的Map:
final filterString = filterByUser ? _params : authToken != null ? {'auth': authToken} : null;
额外小优化
顺便提一句,你原来代码里用json.encode()处理orderBy和equalTo的值其实没必要——Firebase Realtime Database的查询参数直接传字符串就可以了,不需要JSON编码,我上面的代码已经帮你修正了这一点。
内容的提问来源于stack exchange,提问作者DylanTan9818
相关产品推荐
相关产品推荐

