void updateDrag(Offset globalPosition) {
_lastOffset = globalPosition - dragStartPoint;
_entry!.markNeedsBuild();
final HitTestResult result = HitTestResult();
WidgetsBinding.instance.hitTestInView(result, globalPosition + feedbackOffset, viewId);
final List<_DragTargetState<Object>> targets = _getDragTargets(result.path).toList();
bool listsMatch = false;
if (targets.length >= _enteredTargets.length && _enteredTargets.isNotEmpty) {
listsMatch = true;
final Iterator<_DragTargetState<Object>> iterator = targets.iterator;
for (int i = 0; i < _enteredTargets.length; i += 1) {
iterator.moveNext();
if (iterator.current != _enteredTargets[i]) {
listsMatch = false;
break;
}
}
}
// If everything's the same, report moves, and bail early.
if (listsMatch) {
for (final _DragTargetState<Object> target in _enteredTargets) {
target.didMove(this);
}
return;
}
// Leave old targets.
_leaveAllEntered();
// Enter new targets.
final _DragTargetState<Object>? newTarget = targets.cast<_DragTargetState<Object>?>().firstWhere(
(_DragTargetState<Object>? target) {
if (target == null) {
return false;
}
_enteredTargets.add(target);
return target.didEnter(this);
},
orElse: () => null,
);
// Report moves to the targets.
for (final _DragTargetState<Object> target in _enteredTargets) {
target.didMove(this);
}
_activeTarget = newTarget;
}
DragTarget onWillAcceptWithDetails 回调执行的时机。
关键代码
直白说就是用户手指按下的位置到Target中了,就会触发这个回掉。