Flutter: добавление динамического TextFormField для загрузки данных в список
У меня есть приложение для электронной коммерции, в котором я хочу дать пользователю возможность добавлять собственные параметры при публикации своего продукта. У меня есть построенная форма параметров, и у меня есть логика для добавления нового TextFormField для дополнительной "опции", но я не могу отобразить кнопку "Добавить / удалить", чтобы они могли добавить новое поле.
Это код, в котором находится TextFieldForm:
ListTile(
title: Container(
width: 250.0,
child: TextField(
style: TextStyle(color: Colors.white),
controller: brandTextEditingController,
decoration: InputDecoration(
enabledBorder: const OutlineInputBorder(
borderSide:
const BorderSide(color: Colors.white, width: 1.0),
),
hintText: "Type Brand here...",
hintStyle: TextStyle(color: Colors.white),
// border: InputBorder.none,
),
),
),
),
Divider(),
ListTile(
title: Container(
width: 250.0,
child: Column(
children: getOptions(),
),
),
),
Вот что мне нужно добавить динамически:
List<Widget> getOptions(){
List<Widget> optionsTextFields = [];
for(int i=0; i<optionsList.length; i++) {
optionsTextFields.add(
OptionTextFields(i));
SizedBox(width: 16,);
_addRemoveButton(i == optionsList.length-1, i);
}
return optionsTextFields;
}
Widget _addRemoveButton(bool add, int index){
return IconButton(
icon: Icon((add) ? Icons.add : Icons.remove, color: Colors.white,),
onPressed: (){
if(add){
// add new text-fields
optionsList.insert(0, null);
}
else optionsList.removeAt(index);
setState((){});
},
);
}
bool get wantKeepAlive => true;
@override
Widget build(BuildContext context) {
return file == null ? displayUploadScreen() : displayUploadFormScreen();
}
}
class OptionTextFields extends StatefulWidget {
final int index;
OptionTextFields(this.index);
@override
_OptionTextFieldsState createState() => _OptionTextFieldsState();
}
class _OptionTextFieldsState extends State<OptionTextFields> {
TextEditingController optionsTextEditingController;
@override
void initState() {
super.initState();
optionsTextEditingController = TextEditingController();
}
@override
void dispose() {
optionsTextEditingController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
optionsTextEditingController.text = _UploadPageState.optionsList[widget.index] ?? '';
});
return TextField(
style: TextStyle(color: Colors.white),
controller: optionsTextEditingController,
decoration: InputDecoration(
enabledBorder: const OutlineInputBorder(
borderSide:
const BorderSide(color: Colors.white, width: 1.0),
),
hintText: "Option...",
hintStyle: TextStyle(color: Colors.white),
),
);
}
Как мне отобразить кнопку "Добавить / удалить"?
1 ответ
Я смог выяснить, как заставить кнопку работать. Вот код ниже:
Вот основная форма:
ListTile(
key: _formKey,
title: Container(
width: 250.0,
child: Column(
children: getOptions(),
),
),
),
Вот код для getOptions:
List<Widget> getOptions(){
List<Widget> optionsTextFields = [];
for(int i=0; i<optionsList.length; i++) {
optionsTextFields.add(
Row(
children: <Widget>[
Expanded(
flex: 8,
child: OptionTextFields(i),
),
Expanded(
flex: 1,
child: _addRemoveButton(i == optionsList.length-1, i),
),
],
),
);
А вот форма для TextFormField:
return TextField(
style: TextStyle(color: Colors.white),
controller: optionsTextEditingController,
decoration: InputDecoration(
enabledBorder: const OutlineInputBorder(
borderSide:
const BorderSide(color: Colors.white, width: 1.0),
),
hintText: "Option...",
hintStyle: TextStyle(color: Colors.white),
),
);
}
}
Вот код кнопки:
Widget _addRemoveButton(bool add, int index){
return IconButton(
icon: Icon((add) ? Icons.add : Icons.remove, color: Colors.white,),
onPressed: (){
if(add){
// add new text-fields
optionsList.insert(0, null);
}
else optionsList.removeAt(index);
setState((){});
},
);
}
Как видите, мне пришлось разместить строку в столбце, а затем использовать расширенный виджет внутри строки, чтобы получить размещение кнопки "Добавить / удалить".