[英]DropdownButton doesn't reflect value change
我正在尝试为 Android 添加一个下拉列表,我正在使用 DropdownButton,为 iOS 一个 CupertinoPicker:
Platform.isAndroid? AndroidSelect( items: ([0] + priceOptions), value: minPrice, zeroValue: 'no min', onChanged: (int? newVal) { setState(() { minPrice = newVal; }); }, ): CupertinoSelect( initial: initialFromCupertino, onSelectedItemChanged: (index) { setState(() { minPrice = index == 0? null: priceOptions[index - 1]; }); }, options: priceOptionsFrom),
此代码位于showModalBottomSheet
中。
AndroidSelect 是一个单独的无状态小部件:
class AndroidSelect extends StatelessWidget { final List<int> items; final int? value; final String zeroValue; final void Function(int?) onChanged; const AndroidSelect( {Key? key, required this.items, required this.value, required this.onChanged, required this.zeroValue}): super(key: key); @override Widget build(BuildContext context) { print('building…'); return Padding( padding: const EdgeInsets.all(40.0), child: DropdownButton<int>( onChanged: onChanged, value: value?? 0, items: items.map<DropdownMenuItem<int>>((int value) { return DropdownMenuItem<int>( value: value, child: Text( value == 0? zeroValue: '$value CHF', style: const TextStyle(fontSize: 20), ), ); }).toList(), ), ); } }
现在,当我更改下拉列表时,更改将保存到minPrice
(我有另一个依赖于它的小部件并且这个小部件会更新),但下拉列表不反映新值。 print('building…')
不被调用,当setState() {minPrice=newVal};
被执行。 这是为什么?
从showModalBottomSheet
的构建器返回StatefulBuilder
并使用其 setState 更新对话框 UI。
showModalBottomSheet( context: context, builder: (c) { return StatefulBuilder( builder: (context, setStateSB) { return SizedBox( width: 300, height: 200, child: AndroidSelect( items: [1, 2, 4, 5], onChanged: (v) { setStateSB(() { value = v; }); }, value: value, zeroValue: "nana", ), ); }, ); });
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.