Здравствуйте, я новичок во флаттере, работаю над проектом и создаю конструктор форм в флаттере. Для этого мы используем перетаскиваемые элементы, такие как поля ввода текста. Перетаскиваемый объект помещается в цель перетаскивания и принимается очень хорошо. Однако проблема в том, что когда мы 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',
),
),
);
}
}
Вот пример изображения: