Flutter中DropdownSearch无法加载API数据问题求助
问题排查:Flutter DropdownSearch 无法加载API地区数据
问题现象
- 点击DropdownSearch组件无响应,无任何数据显示
- API请求状态码为200,但使用变量
idProv拼接URL时返回空列表;手动替换为固定ID(如000001)则能正常获取数据
核心问题分析
1. idProv初始值无效
首次打开下拉框时,idProv大概率为null或空字符串,导致请求URL的参数变为?id=,API接收到无效参数后返回空数据。而手动填入的000001是合法参数,因此能正常返回数据。
2. 响应解析存在类型错误
手动创建Datum对象时,直接将字符串类型的created_at/updated_at赋值给DateTime类型字段,会触发类型转换异常,导致DropdownSearch加载流程中断,表现为点击无响应。
3. 未复用已定义的模型类
代码中已编写ModelProvince模型,但未用于解析响应,而是手动遍历处理,既冗余又容易引入错误。
修复方案
步骤1:初始化idProv为有效默认值
确保首次请求携带合法参数:
// 初始化为API认可的根地区ID,比如000001 String idProv = "000001";
步骤2:用模型类简化响应解析
直接复用ModelProvince解析整个响应,避免手动遍历的错误:
asyncItems: (text) async { print("当前请求参数idProv: $idProv"); final response = await http.get( Uri.parse('$baseUrl/v1/auth/mhs_siakad/biodata/get_wilayah?id=$idProv'), ); if (response.statusCode != 200) { print("API请求失败,状态码: ${response.statusCode}"); return []; } // 用预定义的模型解析响应 final modelProvince = modelProvinceFromJson(response.body); print("API返回数据条数: ${modelProvince.data.length}"); return modelProvince.data; },
步骤3:添加异常捕获(可选但推荐)
在异步逻辑中加入异常捕获,方便快速定位问题:
asyncItems: (text) async { try { print("当前请求参数idProv: $idProv"); final response = await http.get( Uri.parse('$baseUrl/v1/auth/mhs_siakad/biodata/get_wilayah?id=$idProv'), ); if (response.statusCode != 200) { print("API请求失败,状态码: ${response.statusCode}"); return []; } final modelProvince = modelProvinceFromJson(response.body); print("API返回数据条数: ${modelProvince.data.length}"); return modelProvince.data; } catch (e) { print("加载数据异常: $e"); return []; } },
步骤4:验证参数更新逻辑
检查onChanged中的赋值逻辑,确保value?.idIndukWilayah是API需要的格式(比如是否包含前导零、是否为有效字符串):
onChanged: (value) { idProv = value?.idIndukWilayah ?? "000001"; // 兜底默认值,避免参数为空 },
内容的提问来源于stack exchange,提问作者Meikisihka
相关产品推荐
相关产品推荐

