问题描述
我有一个电子商务应用程序,我想让用户在发布产品时可以添加自定义选项。我已经构建了选项表单,并且具有为其他“选项”添加新的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,hintText: "Option...",);
}
解决方法
我能够弄清楚如何使按钮正常工作。这是下面的代码:
这是主要形式:
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((){});
},);
}
如您所见,我必须在该列中放置一行,然后使用该行中的Expanded小部件来获取“添加/删除”按钮的位置。