Flutter中点击按钮如何获取DropdownButtonFormField的选中值
问题根源
你当前的写法是将类成员变量contactMethod、country以值传递的方式传入createDropdownField方法,方法内部的_valueChoose是独立的局部变量,你在下拉框的onChanged里修改的只是这个局部变量的值,并不会同步修改到State类的成员变量,因此点击打印时拿到的永远是初始赋值的成员变量值。
修复方案
给封装的createDropdownField方法增加onChanged回调参数,把下拉值变化的逻辑上提至State层,直接修改类的成员变量即可,修改后完整代码如下:
class _EditSurveyState extends State<EditSurvey> { String contactMethod; String country; List contactMethodList = ['phone', 'email', 'mail']; List countryList = ['us', 'uk', 'germany']; @override void initState() { super.initState(); contactMethod = surveryData['contact']; country = surveryData['country']; } @override Widget build(BuildContext context) { // 原代码嵌套了两层Scaffold属于语法错误,这里做了修正 return Scaffold( body: Column( children: [ Expanded( flex: screenWidth(context) < 1300 ? 10 : 8, child: SafeArea( child: Column( children: [ createDropdownField( "Contact", contactMethod, contactMethodList, // 下拉值变化直接修改类成员变量 (newVal) => setState(() => contactMethod = newVal) ), createDropdownField( "Country", country, countryList, (newVal) => setState(() => country = newVal) ), Row( mainAxisAlignment: MainAxisAlignment.end, children: [ ElevatedButton( onPressed: () async { print(contactMethod + country); }, style: ElevatedButton.styleFrom( padding: EdgeInsets.symmetric(horizontal: 50), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10) ) ), child: Text( "UPDATE", style: TextStyle( color: Colors.white, fontSize: 15.0, fontWeight: FontWeight.bold, ), ) ), ], ), ] ) ) ) ] ) ); } // 增加onChanged回调参数 Row createDropdownField(String labelText, String _valueChoose, List valueList, ValueChanged onChanged) { return Row ( children: [ SizedBox(height: 25,), Align( alignment: Alignment.centerLeft, child: Text( '$labelText', ), ), DropdownButtonFormField( value: _valueChoose, hint: Text("$labelText"), icon: Icon(Icons.arrow_drop_down), isExpanded: true, // 直接使用传入的回调处理值变化 onChanged: onChanged, items: valueList.map((valueItem){ return DropdownMenuItem( value: valueItem, child: Text(valueItem), ); }).toList(), ), ], ); } }
补充说明
原代码存在两处语法错误也同步做了修正:
- 移除了嵌套的多余
Scaffold,补充了缺失的body参数 - 修复了
Scaffold直接传入children参数的错误,外层套了Column组件
内容的提问来源于stack exchange,提问作者AnuIzu
相关产品推荐
相关产品推荐

