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

