You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 14:40:07