Я новичок в трепетании и до сих пор не понимаю, как работает пользовательский интерфейс.
Вот мой код:
import 'package:flutter/material.dart';
class DragDemoView extends StatefulWidget
{
DragDemoView(Key key) : super(key: key);
@override
DragDemoViewState createState() => new DragDemoViewState();
}
class DragDemoViewState extends State<DragDemoView>
{
Icon icon1;
Icon icon2;
Icon icon4;
Icon icon3;
@override
void initState() {
icon1 = new Icon(Icons.wifi, color: Colors.white,);
icon2 = new Icon(Icons.map, color: Colors.white,);
icon3 = new Icon(Icons.access_alarm, color: Colors.white,);
icon4 = new Icon(Icons.account_balance, color: Colors.white,);
super.initState();
}
bool accepted = false;
@override
Widget build(BuildContext context) {
return Center(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
Draggable(
child: icon1,
feedback: icon1,
childWhenDragging: icon1,
data: icon1,
),
Draggable(
child: icon2,
feedback: icon2,
childWhenDragging: icon2,
data: icon2,
),
Draggable(
child: icon3,
feedback: icon3,
childWhenDragging: icon3,
data: icon3,
),
Draggable(
child: icon4,
feedback: icon4,
childWhenDragging: icon4,
data: icon4,
),
],
),
Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
Container(
width: 100.0,
height: 100.0,
decoration: BoxDecoration(
border: Border.all(),
color: Colors.deepOrangeAccent
),
child: DragTarget<Icon>(builder: (context, List<Icon> candidateData, rejectedData) {
return accepted ? candidateData.first : new Icon(Icons.error, color: Colors.white,);
},
onWillAccept: (data) {
return true;
},
onAccept: (data) {
setState(() {
accepted = true;
});
},
),
),
],
),
],
)
);
}
@override
void dispose() {
super.dispose();
}
Как видите, япытаюсь переместить значок как Draggable в DragTarget и перестроить его там, используя данные, которые я предоставляю с Draggable. Но результат, который я получаю, - это сообщение об ошибке: «Плохое состояние: нет элемента».
Более общая картина здесь такова: сетка или какая-то компоновка на экране, где пользователь может генерировать разныевиджеты (например, изображение), перетаскивая их из списка в нужное место. Как бы я об этом? Предоставьте каждому Draggable ключ, а затем создайте нужный виджет внутри DragTarget, посмотрев соответствующий виджет на ключ? Или я совершенно не прав?