У меня есть макет сетки с несколькими ячейками. Я реализовал поведение перетаскивания без проблем.
Пользователь перетаскивает некоторый элемент из ячейки и отпускает его над 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;
});
}),
),
],
),
);
}
}