使用命名参数过滤Firebase调用无结果,是否为变量类型错误?
问题根因
- 最核心的原因是使用
orderByChild做过滤查询时,你没有在Firebase Realtime Database的安全规则中为new_polys/$orderUuid节点下的userUuid字段配置索引,无索引的过滤查询默认会返回空结果,这也是你不需要过滤逻辑时能正常拿到数据的原因。 - 第二个隐藏问题:你当前的方法中没有定义或传入
orderUuid变量,若该变量为null,会直接导致查询的节点路径错误,自然拿不到数据。 - 变量声明的不规范问题:你用
var polylinesRef;没有指定类型,会被Dart推断为dynamic,虽然不会直接导致运行报错,但会失去编译期类型检查能力,属于不规范的写法。
解决步骤
第一步:添加数据库索引
进入Firebase控制台的Realtime Database规则配置页,添加如下索引规则:
{ "rules": { "new_polys": { "$orderUuid": { ".indexOn": "userUuid" } } } }
第二步:修正代码写法
// 方法补入必填的orderUuid参数,给onlyOwnPolys设置默认值避免空判断 void _fbListenPolylines({bool onlyOwnPolys = false, required String orderUuid}) async { final currentUserUuid = await PrefHelper.getLoginResponse().then((r) => r.uuid); final firebase = await FirebaseHelper.fbDb; // 统一声明为Query类型,DatabaseReference是Query的子类可直接赋值 final Query polylinesRef; if (onlyOwnPolys) { // 用equalTo简化等值查询写法 polylinesRef = firebase .reference() .child('new_polys/$orderUuid') .orderByChild("userUuid") .equalTo(currentUserUuid); } else { polylinesRef = firebase.reference().child('new_polys/$orderUuid'); } _messagesSubscription?.cancel(); _messagesSubscription = polylinesRef.onValue .debounceTime(Duration(seconds: 1)) .listen((Event event) { final Map<dynamic, dynamic>? map = event.snapshot.value as Map?; final orderSegments = map?.entries?.toList(); // 后续业务逻辑 }); }
说明
过滤查询返回的类型是Query,未过滤的数据库引用DatabaseReference本身就是Query的子类,所以统一声明为Query类型的final变量即可,不需要用var声明无类型的变量。
内容的提问来源于stack exchange,提问作者Gordon Fidora
相关产品推荐
相关产品推荐

