setDragScope method
Implementation
Widget setDragScope(T data, Widget child, Key key) {
final Widget keyWidget = child;
return DragAnimWidget(
controller: _animationController,
contextOffset: () => _contextOffsetMap[key],
isExecuteAnimation: () => isDragStart && isOnWillAccept,
didAndChange: (BuildContext context, bool isDispose) {
if (isDispose) {
if (_contextOffsetMap[key]?.context == context) {
_contextOffsetMap.remove(key);
}
} else {
if (_contextOffsetMap.containsKey(key)) {
_contextOffsetMap[key]?.context = context;
_contextOffsetMap[key]?.updateOffset();
} else {
_contextOffsetMap[key] = ContextOffset(context, Offset.zero)..updateOffset();
}
}
},
key: key,
child: DragTarget<T>(
onWillAcceptWithDetails: (DragTargetDetails<T> details) {
acceptDetails = details;
acceptData = data;
if (isDragStart && !DragAnimNotification.isScroll) {
return setWillAccept(details, data);
}
return false;
},
onAcceptWithDetails: widget.onAcceptWithDetails == null
? null
: (DragTargetDetails<T> details) => widget.onAcceptWithDetails?.call(details, data),
onLeave: widget.onLeave == null ? null : (T? moveData) => widget.onLeave?.call(moveData, data),
onMove: widget.onMove == null ? null : (DragTargetDetails<T> details) => widget.onMove?.call(data, details),
hitTestBehavior: widget.hitTestBehavior,
builder: (BuildContext context, List<T?> candidateData, List<dynamic> rejectedData) {
if (widget.maxSimultaneousDrags == 1 && data != dragData) {
return keyWidget;
}
if (widget.draggingWidgetOpacity > 0 && dragData == data) {
return AnimatedOpacity(
opacity: widget.draggingWidgetOpacity,
duration: Duration(milliseconds: 300),
child: keyWidget,
);
}
return Visibility(
child: keyWidget,
maintainState: true,
maintainSize: true,
maintainAnimation: true,
visible: dragData != data,
);
},
),
);
}