startDrag method
void
startDrag({
- required TKey key,
- required RenderSliverTree<
TKey, TData> renderObject, - required ScrollableState scrollable,
- required double indentPerDepth,
- 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();
}