You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 15:27:04