Предоставлена функция, которая создает выпадающее меню, принимающее параметры:
- variableToBeAdded (переменная, которая будет добавлена в базу данных Firebase)
2.placeholderText (текст для подсказки)
- массив элементов, которые создают dropDownMenuItems.
Эта функция используется в форме для получения информации от пользователя.
Проблема в том, что когда на строку _gender ссылаются явно, т.е. не как на параметр функции, значение раскрывающегося меню изменяется. Однако при обращении к параметру thevariableToBeAdded он больше не работает, что меня озадачивает, так как они должны быть точно такого же примитивного типа (String). Я бы скорее написал повторно используемый код, чем копировал и вставлял для каждого пункта выпадающего меню, который я собираюсь иметь в форме Мне нужно около 7.
Я должен также упомянуть, что все это происходит в StatefulWidget
Я попытался изменить место, где объявлено новое значение variableToBeAdded, в onChange setState или нет. Я также исследовал объявление String в initState () безуспешно
List<String> gendersArray = <String>["Male", "Female", "Other",];
final _formKey = GlobalKey<FormState>();
String _gender;
dropdownMenu(String variableToBeAdded, String placeholderText, array) {
variableToBeAdded.toString();
return new Container(
child: new DropdownButton<String>(
isExpanded: true,
hint: Container(
alignment: Alignment.centerLeft,
padding: EdgeInsets.only(bottom: 7.0),
child: text(placeholderText, Colors.grey.shade600, 15.0),
//text is a function that does the text styling
),
value: variableToBeAdded,
items: array
.map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Container(
child: text(value, Colors.black, 15.0),
),
);
}).toList(),
onChanged: (s) {
setState(() {
variableToBeAdded = s;
});
}
)
);
}
//In the form (in the build) call the function
Form(
key: _formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
SizedBox(height: 10.0),
dropdownMenu(_gender, "Gender", gendersArray),
SizedBox(height: 10.0),
),
],
),
),
Когда onChanged вызывает _gender String внутри функции. например
onChanged: (s) {
setState(() {
_gender = s;
});
}
Ожидаемый результат: выпадающие значения меняются при их нажатии.
Фактический результат: значения изменены.
Когда onChanged вызывает параметр variableToBeAdded. например,
onChanged: (s) {
setState(() {
variableToBeAdded = s;
});
}
Ожидаемый результат: выпадающие значения меняются при их нажатии.
Фактический результат: без изменений