Flutter 中如何按 Firebase 子字段值查询数据及代码问题排查
代码存在的问题
- 语法与逻辑错误:首先代码本身存在括号未闭合的问题,
then的回调函数没有正确补全结束的大括号、小括号;其次你在for循环内部声明了Country data,该变量仅在循环块内可访问,同时你把datalist.add(data)写在了循环外部,不仅会触发data未定义的编译错误,就算勉强能运行也只会添加最后一次循环生成的实例,前面所有查询到的国家数据都会丢失。 - 缺少空值校验:如果没有匹配到
continent=Asia的数据,datasnapshot.value会返回null,此时直接调用.keys会抛出空指针异常。 - 可选规范问题:代码中使用的
new关键字在新版Dart中已无需显式书写,child("Country/")末尾的斜杠属于多余内容,Firebase会自动处理节点路径的分隔符。 - 潜在的查询失败问题:如果你没有在Firebase实时数据库的规则中为
Country节点的continent字段配置索引,查询会返回警告甚至无结果,大型数据集下查询性能也会极差。
修正后的参考代码
// 配置索引请在Firebase控制台实时数据库规则中添加如下配置: // "Country": { // ".indexOn": "continent" // } DatabaseReference ref = FirebaseDatabase.instance .reference() .child("Country") .orderByChild("continent") .equalTo("Asia"); ref.once().then((DataSnapshot datasnapshot) { datalist.clear(); // 先判断是否有返回数据 if (datasnapshot.value != null) { Map<dynamic, dynamic> values = datasnapshot.value; values.forEach((key, value) { Country data = Country( value['Country'], value['continent'], value['Capital'], ); datalist.add(data); }); } // 后续可以执行刷新UI等操作 });
内容的提问来源于stack exchange,提问作者Adm
相关产品推荐
相关产品推荐

