Flutter Dragable TextFormField удаляется при наборе текста - PullRequest
0 голосов
/ 22 апреля 2020

Здравствуйте, я новичок во флаттере, работаю над проектом и создаю конструктор форм в флаттере. Для этого мы используем перетаскиваемые элементы, такие как поля ввода текста. Перетаскиваемый объект помещается в цель перетаскивания и принимается очень хорошо. Однако проблема в том, что когда мы go нажимаем на элемент, чтобы ввести текст, элемент немедленно удаляется. На изображении ниже синий - цель перетаскивания, а белый - перетаскиваемые элементы. Как видите, ввод текста добавлен правильно, именно когда я пытаюсь добавить ввод в поле, элемент немедленно удаляется, прежде чем я даже могу начать печатать.

Я прошел через это в отладчике кода VS, и когда я нажимаю для ввода текста, он возвращает меня к этому фрагменту непосредственно перед удалением элемента:

Container(
                      width: MediaQuery.of(context).size.width / 4,
                      child: Draggable<Widget>(
                        child: ListTile(
                          title: Text('Add Text Response'),
                          trailing: Icon(Icons.text_fields),
                        ),
                        data: new TextInputItem(),
                        feedback: Text('Text'),
                      ),

Вот соответствующий код :

class CreateProject extends StatefulWidget {
  @override
  _CreateProjectState createState() => _CreateProjectState();
}

    class _CreateProjectState extends State<CreateProject> {

      @override
      Widget build(BuildContext context) {
        List<Widget> acceptData = [];

        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: Text("Create New Project"),
            ),
            body: Padding(
              padding: EdgeInsets.all(10),
              child: Container(
                child: Column(
                  children: <Widget>[
                    Expanded(
                      child: DragTarget(
                        onWillAccept: (Widget addItem) {
                          print('checking if will accept item');
                          print(addItem);
                          if (addItem == null) {
                            return false;
                          }
                          return true;
                        },
                        onAccept: (Widget addItem) {
                          print('accepting an item');
                          acceptData.add(addItem);
                          print(acceptData);
                        },
                        builder: (context, List<dynamic> candidateData,
                            List<dynamic> rejectedData) {
                          return Container(
                            height: MediaQuery.of(context).size.height,
                            color: Colors.lightBlue[50],
                            child: acceptData.isEmpty
                                ? Center(
                                    child: Text('Add Form Fields Here'),
                                  )
                                : Column(children: acceptData),
                          );
                        },
                      ),
                    ),
                    Column(
                      children: <Widget>[
                        Container(
                          width: MediaQuery.of(context).size.width / 4,
                          child: Draggable<Widget>(
                            child: ListTile(
                              title: Text('Add Text Response'),
                              trailing: Icon(Icons.text_fields),
                            ),
                            data: new TextInputItem(),
                            feedback: Text('Text'),
                          ),
                        ),
                      ],
                    ),
                    Column(
                      children: <Widget>[
                        Container(
                          width: MediaQuery.of(context).size.width / 4,
                          child: Draggable<Widget>(
                            child: ListTile(
                              title: Text('Add User Location'),
                              trailing: Icon(Icons.location_on),
                            ),
                            //child: Text('User Location'),
                            data: new UserLocation(),
                            feedback: Text('Text'),
                          ),
                        ),
                      ],
                    ),
                    Column(
                      children: <Widget>[
                        Container(
                          width: MediaQuery.of(context).size.width / 4,
                          child: Draggable<Widget>(
                            data: new MultipleChoice(),
                            feedback: Text('Mult choice'),
                            child: ListTile(
                              title: Text('Add Multiple choice'),
                              trailing: Icon(Icons.add_box),
                            ),
                          ),
                        ),
                      ],
                    ),
                  ],
                ),
              ),
            ),
          ),
        );
      }
    }

    class TextInputItem extends StatefulWidget {
      @override
      _TextInputItemState createState() => _TextInputItemState();
    }

    class _TextInputItemState extends State<TextInputItem> {
       final controller = new TextEditingController();
      @override
      Widget build(BuildContext context) {
        return Container(
          margin: new EdgeInsets.all(8.0),
          child: new TextField(
            controller: controller,
            decoration: new InputDecoration(
              hintText: 'Text Input Prompt',
            ),
          ),
        );
      }
    }

Вот пример изображения:

enter image description here

1 Ответ

1 голос
/ 23 апреля 2020

Поскольку вы объявляете acceptData в Widget build
Когда Widget перестраивает acceptData становится null снова
Пожалуйста, измените с

@override
  Widget build(BuildContext context) {
    List<Widget> acceptData = [];

на

List<Widget> acceptData = [];
@override
  Widget build(BuildContext context) {
...