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
相关产品推荐
相关产品推荐

