Как перетащить перетаскиваемый элемент снова после его перетаскивания с помощью флаттера? - PullRequest
0 голосов
/ 03 марта 2020

У меня есть макет сетки с несколькими ячейками. Я реализовал поведение перетаскивания без проблем.

Пользователь перетаскивает некоторый элемент из ячейки и отпускает его над DragTarget в другом элементе. Я использую обратные вызовы DragTarget для обработки некоторых других логи c, когда они происходят.

Но я хочу, чтобы мой пользователь мог снова перетащить элемент после его отбрасывания.

Я не могу посмотрите, как этого добиться, используя DragTarget и Draggable.

Я видел этот ответ: Flutter: перетаскивание с помощью Grid , но не подходит для моего случая, потому что элемент только что переместился на экран после позиции курсора, не вызывая никакого обратного вызова, как это делает DragTarget (и мне нужны обратные вызовы thoose).

Вот мой код Dart (Flutter):

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class GridViewCustomizacao extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _GridViewCustomizacaoState();
  }
}

class _GridViewCustomizacaoState extends State<GridViewCustomizacao> {
  bool accepted = false;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: GridView.count(
        crossAxisCount: 4,
        children: <Widget>[
          Card(borderOnForeground: true, child: Text('TESTE 1')),
          Card(borderOnForeground: true, child: Text('TESTE 2')),
          Card(borderOnForeground: true, child: Text('TESTE 3')),
          Card(borderOnForeground: true, child: Text('TESTE 4')),
          Draggable(
            data: 'ICON',
            dragAnchor: DragAnchor.pointer,
            feedback: Container(width: 50, child: Icon(Icons.add_location)),
            child: accepted
                ? Container()
                : Container(width: 50, child: Icon(Icons.add_location)),
            childWhenDragging: Container(),
            onDragStarted: () {
              setState(() {
                accepted = false;
              });
            },
            onDraggableCanceled: (vel, off) {
              setState(() {
                accepted = false;
              });
            },
          ),
          Card(
            borderOnForeground: true,
            child: DragTarget(
                builder: (context, List<String> candidateData, rejectedData) {
              return accepted ? Icon(Icons.add_location) : Container();
            }, onWillAccept: (data) {
              return data == 'ICON';
            }, onLeave: (data) {
              setState(() {
                accepted = false;
              });
            }, onAccept: (data) {
              setState(() {
                accepted = true;
              });
            }),
          ),
        ],
      ),
    );
  }
}

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...