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

Flutter/Dart中如何从HTTP请求结果中移除指定元素?

过滤HTTP返回结果中region为USA的数据

要实现过滤掉region字段为'USA'的条目,你可以在数据处理阶段加入过滤逻辑,这里给你两种实用的实现方式:

方式一:先过滤原始数据再转换对象

在把原始数据转换成Evse对象之前,先用where方法筛掉不符合条件的条目,这样能避免创建不必要的对象,效率更高:

Future fetch() async {
  if (isLoading) return;
  isLoading = true;

  const limit = 10;
  final url = Uri.parse('https://everywhere-dev.iccs.gr:18083/evse/getEvsesPaged?page=$page&pageLimit=$limit&lat=' +
      (this.widget.appController.currentLocation != null ?  this.widget.appController.currentLocation!.latitude : this.widget.appController.originalMapPoint.latitude).toString() + '&lon=' +
      (this.widget.appController.currentLocation != null ?  this.widget.appController.currentLocation!.longitude : this.widget.appController.originalMapPoint.longitude).toString());
  final response = await http.get(url);
  if (response.statusCode == 200) {
    final List newItems = json.decode(response.body)["results"];

    setState(() {
      page++;
      isLoading = false;

      if (newItems.length < limit) {
        hasMore = false;
      }
      // 关键:过滤掉region为USA的条目
      final filteredItems = newItems.where((item) => item['region'] != 'USA').toList();
      tempEvses.addAll(filteredItems.map<Evse>((items) {
        final evseID = items['evseID'];
        final friendlyName = items['friendlyName'];
        final street = items['street'];
        final streetNumber = items['streetNumber'];
        final region = items['region'];
        final lat = items['lat'] ?? 0.0;
        final lng = items['lng'] ?? 0.0;
        final connectorList = items['connectorList'];
        final cpSerial = items['cpSerial'];
        final img = items['img'];

        return Evse(evseID: evseID, friendlyName: friendlyName, street: street, streetNumber: streetNumber, region: region, lat: lat, lng: lng, connectorList: [connectorList], cpSerial: cpSerial, img: img);

      }).toList());
      for(int i=0 ; i<tempEvses.length; i++  ){
        this.tempEvses[i].calculateDistance(widget.appController.currentLocation);
      //  this.tempEvses[i].calculateAvailability();
        this.tempEvses[i].isEvseFavorite(widget.appController.favoritesList);
        this.tempEvses[i].storePlugCounters();
      }
      showEvsePanels();
    });
  }
}

方式二:转换对象后再过滤

如果需要先完成Evse对象的创建再过滤,也可以在映射后直接加过滤逻辑:

// 替换原有的addAll代码块
tempEvses.addAll(newItems.map<Evse>((items) {
  final evseID = items['evseID'];
  final friendlyName = items['friendlyName'];
  final street = items['street'];
  final streetNumber = items['streetNumber'];
  final region = items['region'];
  final lat = items['lat'] ?? 0.0;
  final lng = items['lng'] ?? 0.0;
  final connectorList = items['connectorList'];
  final cpSerial = items['cpSerial'];
  final img = items['img'];

  return Evse(evseID: evseID, friendlyName: friendlyName, street: street, streetNumber: streetNumber, region: region, lat: lat, lng: lng, connectorList: [connectorList], cpSerial: cpSerial, img: img);
}).where((evse) => evse.region != 'USA').toList());

额外提示

  • 如果接口返回的region字段可能为空,建议把过滤条件改成item['region'] != 'USA' && item['region'] != null,避免空值报错
  • 优先选方式一,提前过滤原始数据能减少对象实例化的开销,性能更好

内容的提问来源于stack exchange,提问作者Bill Tertis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:03:34