startDrag method

void startDrag({
  1. required TKey key,
  2. required RenderSliverTree<TKey, TData> renderObject,
  3. required ScrollableState scrollable,
  4. required double indentPerDepth,
  5. required Offset pointerGlobal,
})

Begins a drag session for key.

renderObject is the RenderSliverTree that currently displays treeController. scrollable is the ancestor scrollable whose viewport clips the tree — used for pointer → scroll-space conversion and autoscroll. indentPerDepth is the horizontal indent the tree uses per depth level; used to position the drop indicator.

Throws ArgumentError if renderObject.controller is not the same controller passed to this reorder controller (cross-controller drag is out of scope) or if canReorder returns false for key.

Implementation

void startDrag({
  required TKey key,
  required RenderSliverTree<TKey, TData> renderObject,
  required ScrollableState scrollable,
  required double indentPerDepth,
  required Offset pointerGlobal,
}) {
  if (!identical(renderObject.controller, treeController)) {
    throw ArgumentError.value(
      renderObject,
      "renderObject",
      "renderObject.controller must be the same TreeController passed to "
      "TreeReorderController. Cross-controller drag is not supported.",
    );
  }
  if (canReorder != null && !canReorder!(key)) {
    throw ArgumentError.value(
      key,
      "key",
      "canReorder returned false for this key; drag cannot start",
    );
  }
  if (_session != null) {
    cancelDrag();
  }
  _session = _DragSession<TKey>(
    draggedKey: key,
    // Store under a less-tightly-typed field so this controller doesn't
    // need to propagate the TData parameter into every internal helper.
    renderObject: renderObject as RenderSliverTree<TKey, Object?>,
    scrollable: scrollable,
    indentPerDepth: indentPerDepth,
    pointerGlobal: pointerGlobal,
  );
  _recomputeDropTarget();
  // Drag session just started; currentTarget may have become non-null.
  notifyListeners();
}