Как изменить положение двух виджетов 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),
                        ),
                      ],
                    )),
              ])),
            ));
  }

Заранее спасибо.

0 ответов

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