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

Flutter调用TurkiyeAPI获取选中城市区县失败问题求助

土耳其城市区县API调用问题修复

问题现象

在Flutter项目中调用TurkiyeAPI实现城市列表展示及选中城市对应区县获取功能时,区县显示异常:要么展示全国所有城市名称(而非区县),要么仅显示选中的城市名称。

问题根源

  1. 数据解析逻辑错误:查询特定城市的API返回结果中,data字段是包含目标城市对象的数组,而非区县数组。原代码直接提取该数组的name字段,导致把城市名称当作区县名称返回。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:27:12