Flutter中如何从Firebase实时数据库按城市筛选配送员
Flutter Firebase实时数据库筛选指定城市的配送员
方案一:基于现有在线司机列表筛选
你可以在获取每个司机的信息后,判断其City字段是否匹配目标城市,仅将符合条件的司机加入列表。修改后的代码如下:
retrieveOnlineDriversInformation(List onlineNearestDriversList, String targetCity) async { DatabaseReference ref = FirebaseDatabase.instance.ref().child("DeliveryBoys"); // 清空列表避免重复数据 dList.clear(); for (int i = 0; i < onlineNearestDriversList.length; i++) { await ref .child(onlineNearestDriversList[i].driverId.toString()) .once() .then((dataSnapshot) { Map<String, dynamic>? driverInfo = dataSnapshot.snapshot.value as Map<String, dynamic>?; // 校验数据存在且城市匹配时加入列表 if (driverInfo != null && driverInfo['City'] == targetCity) { dList.add(driverInfo); } }); } }
调用时传入目标城市即可,比如:
retrieveOnlineDriversInformation(yourOnlineDriversList, "北京");
方案二:直接从数据库过滤(更高效)
如果不需要依赖传入的在线司机列表,而是直接查询指定城市的配送员(可同时筛选在线状态),建议使用Firebase的查询功能,减少不必要的数据读取:
retrieveCityOnlineDrivers(String targetCity) async { DatabaseReference ref = FirebaseDatabase.instance.ref().child("DeliveryBoys"); dList.clear(); // 构建查询:筛选City等于目标城市的配送员 Query cityDriversQuery = ref.orderByChild("City").equalTo(targetCity); // 若需同时筛选在线状态(假设在线字段为isOnline),需添加复合查询(需配置索引) // Query cityDriversQuery = ref.orderByChild("City").equalTo(targetCity).orderByChild("isOnline").equalTo(true); DataSnapshot snapshot = await cityDriversQuery.get(); if (snapshot.exists) { Map<String, dynamic> driversMap = snapshot.value as Map<String, dynamic>; driversMap.forEach((driverId, driverInfo) { dList.add(driverInfo); }); } }
注意事项
- 确保每个配送员节点的
City字段值与传入的目标城市字符串完全匹配(包括大小写、空格) - 使用复合查询时,需在Firebase控制台的实时数据库规则中添加对应索引:
{ "rules": { "DeliveryBoys": { ".indexOn": ["City", "isOnline"] } } }
内容的提问来源于stack exchange,提问作者peter makala
相关产品推荐
相关产品推荐

