在Flutter代码中,我有一个下拉列表链接到汽车列表。一旦选择了汽车,我想检索与汽车相关的品牌。但是由于某些原因,用于读取Firebase RTDB的代码对于索引0,索引1和索引2及更高版本必须有所不同。我从RTDB中获取的示例树如下:
[ {
"Brand" : "Alfa Romeo",
"Car" : "Alfa Romeo Guilia 2.9 V6 BiTurbo Quadrifoglioli Automatic Petrol Sedan RWD",
}, {
"Brand" : "Alfa Romeo",
"Car" : "Alfa Romeo Guilia 2.0T Standard Automatic Petrol Sedan RWD",
}, {
"Brand" : "Alfa Romeo",
"Car" : "Alfa Romeo Guilia 2.0T Super Automatic Petrol Sedan RWD",
}, {
"Brand" : "Alfa Romeo",
"Car" : "Alfa Romeo Stelvio 2.0 Turbo Super Automatic Petrol SUV AWD",
}, {
"Brand" : "Alfa Romeo",
"Car" : "Alfa Romeo Stelvio 2.0 Turbo First Edition Automatic Petrol SUV AWD",
}, {
"Brand" : "Alfa Romeo",
"Car" : "Alfa Romeo 4C 1750Tbi N/A TCT Petrol Coupe RWD",
}]
上面的父项是“ CarList2”
在我的颤动代码中,我必须使用以下内容来检索品牌:
final dbRef = FirebaseDatabase.instance.reference().child('CarList2');
void CreateNewDeal(String selectedcar) async{
await dbRef.orderByChild('Car').equalTo(selectedcar).once().then((DataSnapshot snap) {
print('length - ${snap.value.length}');
List<dynamic> brand = [];
// Code for Index 0 and index 1
snap.value.forEach((v1) {
brand.add(v1);
if(snap.value.length == 1 && brand[0]['Brand'] != null){
selectedbrand = brand[0]['Brand'];
print('brand index0 - ${brand[0]['Brand']}');
}
else if(snap.value.length == 2){
print('brand index 1 - ${snap.value[1]['Brand']}');
}
});
/**
following code gets the brand for index 1-->
*/
Map<dynamic,dynamic> values = snap.value;
values.forEach((key, v2) {
selectedbrand = v2['Brand'];
print('Brand index 2>:(${v2['Brand']})');
});
});
}catch(e){
print(e.toString());
}
}
在上述情况下,如果选择了索引1汽车,则无法与索引1同时运行索引0和索引2,因为代码将在索引0或2上返回空值,因此永远不会将其添加到代码中用于索引1。
我还获得了子级快照的可变长度,如下所示:
索引0 =长度1 索引1-长度2 索引2以上=长度1
我是在做错什么还是要以其他方式阅读本文章?
答案 0 :(得分:0)
对于任何寻求类似解决方案的人,请注意弗兰克·范·普菲伦(Frank van Puffelen)在评论中向我提供的答案。阅读文章,但总而言之,请远离编号索引。
弗兰克(Frank)为我提供了实质上重新构造树的方向,这很容易做到。使用firebase导出,使用Json到CSV转换器(可以在线找到-我使用https://www.convertcsv.com/csv-to-json.htm)。一旦为CSV格式,请在第一列中添加一个key
列。添加任何顺序字符串作为键。然后使用在线CSV到Json转换器再次进行转换。我使用了这个(https://csvjson.com/csv2json),因为您想要的是将新树创建为哈希图(至少在我的实例中),但是您不想在另一个网站的键和子级之间再创建一个编号索引结束了。
通过这样做,您现在可以检索所有节点的子节点,而不会出现空错误,而我在索引0、1和2之间。
注意:这对我来说是一个特定的问题,因为我的列表是静态的,是在应用程序外部创建的,并且偶尔会更新一次。如果您通过该应用创建列表,则应该不会出现这样的错误。