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

Flutter二级DropdownButton数据存在却不显示,求助排查问题

问题分析与解决方案

你的第二个下拉框已拿到数据却无法显示选项,主要排查以下几个核心问题:

1. 自定义类未重写相等性判断方法

DropdownButtonFormField依赖对象的相等性匹配选中值和选项列表。如果Ville类没重写==和hashCode,即使villes有数据,Flutter也无法识别ville(即choises[0])属于选项列表,导致下拉框无法渲染选项。

修改Ville类,添加相等性判断:

class Ville {
  final int id;
  final String nom_ville;
  // 其他字段...

  Ville({required this.id, required this.nom_ville/*, 其他参数*/});

  @override
  bool operator ==(Object other) =>
      identical(this, other) ||
      other is Ville &&
          runtimeType == other.runtimeType &&
          id == other.id; // 用唯一标识(比如id)判断相等

  @override
  int get hashCode => id.hashCode;
}

2. 初始空状态的处理

初始时villes为空,第二个下拉框的items是空列表,会显示空白。可以添加占位提示或隐藏下拉框直到有数据:

DropdownButtonHideUnderline(
  child: ButtonTheme(
    child: villes.isEmpty 
        ? Text("先选择省份") // 占位提示
        : DropdownButtonFormField<Ville>(
            value: ville,
            onChanged: (Ville? newValue) {
              setState((){
                ville = newValue!;
              });
            },
            items: villes.map((ville){
              return DropdownMenuItem<Ville>(
                child: Text(ville.nom_ville),
                value: ville
              );
            }).toList(),
          )
  )
)

3. 确保下拉框在build方法内

如果第二个下拉框不在StatefulWidget的build方法中,调用setState后它不会重新构建,自然不会更新选项。检查布局结构,确保下拉框是build方法的一部分。

4. 验证异步数据获取结果

在第一个下拉框的onChanged回调中,添加日志确认数据是否正确获取:

onChanged: (province) async{
  final choises = await dbHelper.citiesOfAProvince(province!.id);
  print("获取到的城市数量:${choises.length}"); // 验证数据是否存在
  setState(() {
    maProvince = province;
    villes = choises;
    if(choises.isNotEmpty){ // 避免数组越界
      ville = choises[0];
    }
  });
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 11:37:15