Выпадающий список Flutter, select отключен при ошибке проверки

#validation #flutter #dart #dropdown

#проверка #flutter #dart #выпадающий список

Вопрос:

Проверка работает хорошо, но в случае ошибки проверки возможность выбора опции отключена.

                                       DropdownButtonFormField(
                                        isExpanded: true,
                                        hint: Text('Gender'),
                                        value: _selectedGender,
                                        onChanged: (newValue) {
                                          setState(() {
                                            _selectedGender = newValue;
                                          });
                                        },
                                        items: _gender.map((gender) {
                                          return DropdownMenuItem(
                                            child: new Text(gender),
                                            value: gender,
                                          );
                                        }).toList(),
                                        validator: (value) {
                                          if (value == null)
                                            return "Please select your gender";
                                          return null;
                                        },
                                      ),
  

Приведенный выше код находится в режиме просмотра страницы,

мои переменные

   List<String> _gender = ['Male', 'Female'];
  String _selectedGender;
  

Весь мой код формы: просто сокращен до одного поля, он очень длинный

 
class SignUp extends StatefulWidget {
  @override
  _SignUpState createState() => _SignUpState();
}

class _SignUpState extends State<SignUp> {
  final List<GlobalKey<FormState>> _page = [
    GlobalKey<FormState>(),
    GlobalKey<FormState>(),
    GlobalKey<FormState>(),
  ];

  final _key = GlobalKey<ScaffoldState>();
  
 
  List<String> _gender = ['Male', 'Female'];
  String _selectedGender;

    void changePage() {
    if (currentPageValue < 3) {
      if (_page[currentPageValue].currentState.validate()) {
        setState(() {
          currentPageValue  = 1;
        });
      }
    }
  }
  


  @override
  Widget build(BuildContext context) {
    var deviceSize = MediaQuery.of(context).size;
    var deviceWidth = deviceSize.width;

    return Scaffold(
      key: _key,
      backgroundColor: _backgroundColor,
      appBar: AppBar(
        backgroundColor: _backgroundColor,
        leading: IconButton(
            icon: Icon(
              currentPageValue == 0 ? Icons.close : Icons.keyboard_backspace,
              size: 20.0,
              color: _headerColor,
            ),
            onPressed: currentPageValue == 0
                ? () => Navigator.pop(context)
                : () => back()),
        centerTitle: true,
        elevation: 0.0,
      ),
      body: Form(
        key: _page[0],
        child: Container(
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
             
                Container(
                  width: deviceWidth * 0.9,
                  height: dropDownHeight,
                  child: ButtonTheme(
                    child: DropdownButtonFormField(
                      isExpanded: true,
                      hint: Text('Gender'),
                      value: _selectedGender,
                      onChanged: (newValue) {
                        setState(() {
                          _selectedGender = newValue;
                        });
                      },
                      items: _gender.map((gender) {
                        return DropdownMenuItem(
                          child: new Text(gender),
                          value: gender,
                        );
                      }).toList(),
                      validator: (value) {
                        if (value == null) return "Please select your gender";
                        return null;
                      },
                    ),
                  ),
                ),
               RaisedButton(
                                    color: buttonColor,
                                    shape: RoundedRectangleBorder(
                                      borderRadius:
                                          BorderRadius.circular(10.0),
                                    ),
                                    child: Text(
                                      'Next',
                                      style: TextStyle(
                                        color: Colors.white,
                                        fontWeight: FontWeight.w400,
                                      ),
                                    ),
                                    onPressed: () => changePage(),
                                  ),
            ],
          ),
        ),
      ),
    );
  

Комментарии:

1. Какую версию Flutter вы используете?

2. Flutter 1.20.2

3. Отправьте код формы и код, который проверяет эту форму, пожалуйста

4. Я создал DartPad с вашим текущим кодом, и он работает: dartpad.dev/cfef9877ad1370f348d28c7fb918be33

5. спасибо за помощь, увидев, что ваш образец работает нормально, в моем коде должна быть ошибка, которую я ввожу

Ответ №1:

Глядя на ваш код, я настоятельно рекомендую вам создать 3 разных Form и проверять их отдельно, чтобы у вас не возникло никаких проблем с состоянием формы. Для достижения этой цели вы можете просто поместить поля в соответствующие Form формы и убедиться, что они не смешиваются и не помещаются одна в другую.

Ниже приведен пример, основанный на вашем коде и на том, что я сказал:

 class SignUp extends StatefulWidget {
  @override
  _SignUpState createState() => _SignUpState();
}

class _SignUpState extends State<SignUp> {
  final _page1 = GlobalKey<FormState>();
  final _page2 = GlobalKey<FormState>();
  final _page3 = GlobalKey<FormState>();

  final _key = GlobalKey<ScaffoldState>();
  
  int currentPageValue;

  List<String> _gender = ['Male', 'Female'];
  String _selectedGender;

  void changePage(GlobalKey<FormState> page) {
    if (currentPageValue < 3) {
      if (page.currentState.validate()) {
        setState(() {
          currentPageValue  = 1;
        });
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: _key,
      body: ListView(
        children: <Widget>[
          Form(
            key: _page1,
            child: Column(
              children: [
                DropdownButtonFormField(
                  isExpanded: true,
                  hint: Text('Gender'),
                  value: _selectedGender,
                  onChanged: (newValue) {
                    setState(() {
                      _selectedGender = newValue;
                    });
                  },
                  items: _gender.map((gender) {
                    return DropdownMenuItem(
                      child: new Text(gender),
                      value: gender,
                    );
                  }).toList(),
                  validator: (value) {
                    if (value == null) return "Please select your gender";
                    return null;
                  },
                ),
                RaisedButton(
                  child: Text('Next'),
                  onPressed: () => changePage(_page1),
                ),
              ],
            ),
          ),
          Form(
            key: _page2,
            child: Column(
              children: [
                // SomeField(
                //
                // ),
                // SomeOtherField(
                //
                // ),
                RaisedButton(
                  child: Text('Next'),
                  onPressed: () => changePage(_page2),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }
}