DragTarget onWillAcceptWithDetails 回调执行的时机。

106 阅读1分钟
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 回调执行的时机。

关键代码 image.png

直白说就是用户手指按下的位置到Target中了,就会触发这个回掉。