简体   繁体   中英

How to get DropdownButtonFormField value with a button click - Flutter

I am trying to develop a survey form using Flutter and I have multiple dropdown fields in the form. I want to get the selected values from those dropdowns when I click the save button. But all I am getting is the value I initially set inside initState(). The code I am using is as below. Any help to get this sorted out is much appreciated.

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) {
    return Scaffold(
      return Scaffold(
        children: [
          Expanded(
            flex: screenWidth(context) < 1300 ? 10 : 8,
            child: SafeArea(
              child: Column(
                children: [
                  createDropdownField("Contact", contactMethod, contactMethodList),
                  createDropdownField("Country", country, countryList),
                  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,
                         ),
                       )
                     ),
                   ],
                 ),
                ]
              )
            )
          ) 
        ]  
      )
    );
  }
  
  Row createDropdownField(String labelText, String _valueChoose, List valueList) {
    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: (newValue){
            setState(() {
              _valueChoose = newValue;
            });
          },
          items: valueList.map((valueItem){
            return DropdownMenuItem(
              value: valueItem,
              child: Text(valueItem),
            );
          }).toList(),
        ),
      ],
    );
  }
} 

I don't understand why you using intitstate if you want to initialize value to String you can do it while declaring, try removing initstate and

Declare a variable first where you will store new value from dropdown onchange

ie

class _EditSurveyState extends State<EditSurvey> {
String _currentValue;
DropdownButtonFormField(
              
              onChanged: (val) =>
                  setState(() => _currentValue = val as String),
              value: _currentValue ,
              items: YourList.map((item) {
                return DropdownMenuItem(
                  value: item,
                  child: Text('$item Items'),
                );
              }).toList(),
            ),

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM