Flutter:添加动态 TextFormField 以将数据上传到列表

Posted

技术标签:

【中文标题】Flutter:添加动态 TextFormField 以将数据上传到列表【英文标题】:Flutter: Adding a dynamic TextFormField to upload data to a list 【发布时间】:2020-12-31 03:01:05 【问题描述】:

我有一个电子商务应用,我想让用户在发布产品时能够添加自定义选项。我已经构建了选项表单,并且我有为附加“选项”添加新 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(());
        ,
    );
  

如您所见,我必须在列中放置一行,然后使用该行中的 Expanded 小部件来获得添加/删除按钮的位置。

【讨论】:

以上是关于Flutter:添加动态 TextFormField 以将数据上传到列表的主要内容,如果未能解决你的问题,请参考以下文章

Flutter - 在无状态小部件中动态地将项目添加到 ListView

Flutter中页面之间动态添加数据

在 Flutter 的垂直列表中添加动态高度水平列表视图

在flutter中使用listview.builder添加多个彼此不同的动态小部件

如何在 Flutter 中添加 TextEditingController 并从动态 TextFormField 中获取文本值?

Flutter:如何调用本地 JSON 数据并动态添加到标签栏?