Flutter DataTable中DropdownButton选中值同步问题咨询
你遇到的问题核心是所有行的DropdownButton都绑定了同一个dropdownvalue变量,只要修改这个变量,所有行都会跟着变化。要让每行独立维护选中状态,你需要用一个数组来存储每行的选中值,对应DataTable的索引位置。
具体修改步骤:
- 把单个的
dropdownvalue替换成List<String?>类型的变量,长度和myList一致,初始化时可设置每行默认选中值(比如对应索引的myList元素,或者设为null)。 - 生成
DataRow时,每个DropdownButton的value对应数组里的selectedValues[index]。 - 点击下拉选项时,只更新数组中对应索引位置的值。
修改后的完整代码:
// 原字符串列表 static List<String> myList = ['a1','a2','a3','a4','a5']; // 新增:存储每行的选中值,初始化默认选中对应索引的元素 List<String?> selectedValues = List.generate(myList.length, (index) => myList[index]); int getlistRowsCount(){ return myList.length; // 注意:length是List的属性,不需要加括号 } Widget get mytable { // 改成getter避免初始化时机问题 return Container( child: SizedBox( height: 500, child: DataTable( columns: [ DataColumn(label: Text('My heading')), ], rows: List<DataRow>.generate( getlistRowsCount(), (index) => DataRow( cells: [ DataCell( DropdownButton<String>( value: selectedValues[index], onChanged: (String? newValue) { setState(() { // 仅更新当前索引对应的选中值 selectedValues[index] = newValue!; }); }, items: myList.map<DropdownMenuItem<String>>((String xyz) { return DropdownMenuItem<String>( value: xyz, child: Text(xyz), ); }).toList(), ), ), ], ), ), ), ), ); }
额外说明:
- 原代码中
myList.length()是错误写法,length是List的属性,无需加括号,改为myList.length即可。 - 如果不需要默认选中值,初始化时可以把
selectedValues设为List<String?>.filled(myList.length, null),下拉框初始状态为空。 - 这种通过索引绑定状态的方式,还能避免
indexOf带来的重复元素问题(比如myList存在重复字符串时,indexOf只会返回第一个匹配的索引,导致状态混乱)。
内容的提问来源于stack exchange,提问作者DktPhl2018
相关产品推荐
相关产品推荐

