Как изменить положение двух виджетов DragTarget (флаттер)?
Я новичок во Flutter, и у меня есть множество Draggables и DragTargets, которые отлично работают. Однако я хотел бы иметь возможность переключать позиции DragTargets, когда один перетаскивается поверх другого. Я до сих пор не нашел способа это сделать. Может ли кто-нибудь помочь мне в этом?
Чтобы у вас было более четкое представление о том, что я пытаюсь сделать, это приложение для баскетбола, в котором игроки отображаются на баскетбольной площадке и являются DragTargets, а также набор действий (+1 балл, +2 балла и т. Д.) являются перетаскиваемыми объектами. Теперь я хотел бы поменять позиции игроков (то есть DragTargets), каким-то образом получив роль Draggable, оставаясь в то же время DragTarget.
Код довольно длинный, поскольку я определяю персонализированные классы, а виджеты разделяют между собой много данных. Но, по сути, у меня есть контейнер (представляющий баскетбольную площадку) с виджетом Stack в качестве дочернего элемента, чьи дочерние элементы - это виджеты 10 игроков (т.е. DragTargets) и несколько Draggables для подсчета их очков, передач и т. Д.
Ниже приведен код, относящийся к определению виджета DragTarget, представляющего игрока:
class Player {
int playerNumer;
int playerPoints;
int playerAssists;
int playerRebounds;
String team;
Player(this.playerNumer, this.playerPoints, this.playerAssists,
this.playerRebounds, this.team);
}
class PlayerWidget extends StatefulWidget {
final Player player;
final List position;
final bool showStats;
PlayerWidget(this.player, this.position, this.showStats);
@override
_PlayerWidgetState createState() => _PlayerWidgetState();
}
class _PlayerWidgetState extends State<PlayerWidget> {
int playerNumber = 0;
int playerPts = 0;
int playerAst = 0;
int playerRbs = 0;
String playerTeam = 'home';
String relPosition = 'TL';
Offset relCoordinates = Offset(0.0, 0.0);
bool showStats = true;
var iconsDict = {
0: Icons.filter,
1: Icons.filter_1,
2: Icons.filter_2,
3: Icons.filter_3,
4: Icons.filter_4,
5: Icons.filter_5,
6: Icons.filter_6,
7: Icons.filter_7,
8: Icons.filter_8,
9: Icons.filter_9,
};
var teamColor = {'home': Colors.red[900], 'visitor': Colors.blue[900]};
@override
void initState() {
super.initState();
playerNumber = widget.player.playerNumer;
playerPts = widget.player.playerPoints;
playerAst = widget.player.playerAssists;
playerRbs = widget.player.playerRebounds;
playerTeam = widget.player.team;
relPosition = widget.position[0];
relCoordinates = widget.position[1];
showStats = widget.showStats;
}
@override
Widget build(BuildContext context) {
if (relPosition == 'TL') {
return Positioned(
top: relCoordinates.dy,
left: relCoordinates.dx,
child: _createDragTarget(),
);
}
if (relPosition == 'BL') {
return Positioned(
bottom: relCoordinates.dy,
left: relCoordinates.dx,
child: _createDragTarget(),
);
}
if (relPosition == 'TR') {
return Positioned(
top: relCoordinates.dy,
right: relCoordinates.dx,
child: _createDragTarget(),
);
}
if (relPosition == 'BR') {
return Positioned(
bottom: relCoordinates.dy,
right: relCoordinates.dx,
child: _createDragTarget(),
);
}
}
Widget _createDragTarget() {
return DragTarget<List>(
onAccept: (receivedAction) {
var id = receivedAction[0];
var value = receivedAction[2];
if (id >= 1 && id <= 6) {
setState(() {
playerPts += value;
});
}
},
onWillAccept: (receivedAction) => true,
builder: (context, acceptedActions, rejectedActions) => Container(
child: Container(
child: Column(children: <Widget>[
Icon(
iconsDict[playerNumber],
size: 36,
color: teamColor[playerTeam],
),
Visibility(
visible: showStats,
child: Column(
children: <Widget>[
Text(
'Pts: $playerPts',
style: TextStyle(
fontWeight: FontWeight.bold, fontSize: 16),
),
Text(
'Ast: $playerAst',
style: TextStyle(
fontWeight: FontWeight.bold, fontSize: 16),
),
Text(
'Rbs: $playerRbs',
style: TextStyle(
fontWeight: FontWeight.bold, fontSize: 16),
),
],
)),
])),
));
}
Заранее спасибо.