我创建了一个DropdownButton作为StatefulWidget。该类称为MyDropDown,相应的状态称为MyDropDownState。
我在MyDropDownState类中创建了一个重置函数:
void reset(){ setState((){ _selection = null; }); }
这会将选择设置为null并设置下拉菜单的状态,从而有效地重置下拉菜单。
问题的核心是我必须在按下AppBar上的IconButton时调用此函数。我尝试了多种方法,但无法访问我创建的MyDropDown类的状态。
这是MyDropDown的代码,它的状态是简化的:
class MyDropDown extends StatefulWidget { final Map<String, String> _itemMap; MyDropDown(this._itemMap); @override MyDropDownState createState() => new MyDropDownState(); } class MyDropDownState extends State<MyDropDown> { String _selection; void reset(){ setState((){ _selection = null; }); } @override void initState() { _selection = null; super.initState(); } @override Widget build(BuildContext context) { return new DropdownButton( value: _selection, //getDropItems builds dropdown items items: getDropItems(widget._itemMap), onChanged: (s) { setState(() { _selection = s; }); }, ); } }
在我的主页中,创建一个新的MyDropDown
final MyDropDown cityDropdown = new MyDropDown(cityLookup);
那么这是AppBar(在脚手架内),其中装有我要按下以重置Dropdown的IconButton。
appBar : new AppBar( title: new Text('Filter Jobs'), actions: <Widget>[ new IconButton( icon: new Icon(Icons.refresh), onPressed: () { print('Reset dropdowns'); //this is where I would call reset() on cityDropdown's state, if I could figure out how to get to it :/ }, ), ], ),
这里最简单的解决方案是使用GlobalKey<T>:https : //docs.flutter.io/flutter/widgets/GlobalKey- class.html
GlobalKey<T>
GlobalKey<MyDropDownState>
key.currentState.reset()
另外,您可以使用Flutter本身使用的控制器模式。例如TextField具有TextEditingController:https : //docs.flutter.io/flutter/widgets/TextEditingController- class.html
TextField
TextEditingController