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((){});
        },
    );
  }

Как видите, мне пришлось разместить строку в столбце, а затем использовать расширенный виджет внутри строки, чтобы получить размещение кнопки "Добавить / удалить".

Другие вопросы по тегам