Flutter调用TurkiyeAPI获取选中城市区县失败问题求助
土耳其城市区县API调用问题修复
问题现象
在Flutter项目中调用TurkiyeAPI实现城市列表展示及选中城市对应区县获取功能时,区县显示异常:要么展示全国所有城市名称(而非区县),要么仅显示选中的城市名称。
问题根源
- 数据解析逻辑错误:查询特定城市的API返回结果中,
data字段是包含目标城市对象的数组,而非区县数组。原代码直接提取该数组的name字段,导致把城市名称当作区县名称返回。 - URL编码缺失:土耳其城市名称包含特殊字符(如
İ),未编码直接拼接URL会导致API无法正确匹配目标城市,返回所有城市数据。
修复代码
修正fetchDistricts方法
Future<void> fetchDistricts(String selectedCity) async { // 对城市名称进行URL编码,处理特殊字符 final encodedCityName = Uri.encodeComponent(selectedCity); var response = await http.get(Uri.parse( 'https://turkiyeapi.dev/api/v1/provinces?name=$encodedCityName')); if (response.statusCode == 200) { final List<dynamic> provinceData = json.decode(response.body)["data"]; // 确保获取到匹配的城市对象 if (provinceData.isNotEmpty) { final Map<String, dynamic> selectedProvince = provinceData.first; // 提取城市下的区县数组 final List<dynamic> districtList = selectedProvince['districts']; List<String> districtNames = districtList.map((district) => district['name'].toString()).toList(); setState(() { districts = districtNames; }); } else { if (kDebugMode) { print("未找到匹配的城市"); } setState(() { districts = []; }); } } else { if (kDebugMode) { print(response.reasonPhrase); } setState(() { districts = []; }); } }
其他注意事项
- 确保已导入
dart:convert和package:http/http.dart包 - 区县列表的
ListView.builder无需修改,修复后会自动正确渲染区县数据
内容的提问来源于stack exchange,提问作者ckot
相关产品推荐
相关产品推荐

