DirectionalFocusTraversalPolicyMixin mixin
A mixin class that provides an implementation for finding a node in a particular direction.
This can be mixed in to other FocusTraversalPolicy implementations that only want to implement new next/previous policies.
Since hysteresis in the navigation order is undesirable, this implementation maintains a stack of previous locations that have been visited on the policy data for the affected FocusScopeNode. If the previous direction was the opposite of the current direction, then the this policy will request focus on the previously focused node. Change to another direction other than the current one or its opposite will clear the stack.
For instance, if the focus moves down, down, down, and then up, up, up, it will follow the same path through the widgets in both directions. However, if it moves down, down, down, left, right, and then up, up, up, it may not follow the same path on the way up as it did on the way down, since changing the axis of motion resets the history.
This class implements an algorithm that considers an infinite band extending along the direction of movement, the width or height (depending on direction) of the currently focused widget, and finds the closest widget in that band along the direction of movement. If nothing is found in that band, then it picks the widget with an edge closest to the band in the perpendicular direction. If two out-of-band widgets are the same distance from the band, then it picks the one closest along the direction of movement.
The goal of this algorithm is to pick a widget that (to the user) doesn't appear to traverse along the wrong axis, as it might if it only sorted widgets by distance along one axis, but also jumps to the next logical widget in a direction without skipping over widgets.
See also:
- FocusNode, for a description of the focus system.
- FocusTraversalGroup, a widget that groups together and imposes a traversal policy on the Focus nodes below it in the widget hierarchy.
- WidgetOrderTraversalPolicy, a policy that relies on the widget creation order to describe the order of traversal.
- ReadingOrderTraversalPolicy, a policy that describes the order as the natural "reading order" for the current Directionality.
- OrderedTraversalPolicy, a policy that describes the order explicitly using FocusTraversalOrder widgets.
- Superclass constraints
- Mixin applications
Properties
- hashCode → int
-
The hash code for this object.
no setterinherited
- requestFocusCallback → TraversalRequestFocusCallback
-
The callback used to move the focus from one focus node to another when
traversing them using a keyboard. By default it requests focus on the next
node and ensures the node is visible if it's in a scrollable.
finalinherited
- runtimeType → Type
-
A representation of the runtime type of the object.
no setterinherited
Methods
-
changedScope(
{FocusNode? node, FocusScopeNode? oldScope}) → void -
This is called whenever the given
node
is re-parented into a new scope, so that the policy has a chance to update or invalidate any cached data that it maintains per scope about the node.override -
debugFillProperties(
DiagnosticPropertiesBuilder properties) → void -
Add additional properties associated with the node.
inherited
-
findFirstFocus(
FocusNode currentNode, {bool ignoreCurrentFocus = false}) → FocusNode? -
Returns the node that should receive focus if focus is traversing
forwards, and there is no current focus.
inherited
-
findFirstFocusInDirection(
FocusNode currentNode, TraversalDirection direction) → FocusNode? -
Returns the first node in the given
direction
that should receive focus if there is no current focus in the scope to which thecurrentNode
belongs.override -
findLastFocus(
FocusNode currentNode, {bool ignoreCurrentFocus = false}) → FocusNode -
Returns the node that should receive focus if focus is traversing
backwards, and there is no current focus.
inherited
-
inDirection(
FocusNode currentNode, TraversalDirection direction) → bool -
Focuses the next widget in the given
direction
in the FocusScope that contains thecurrentNode
.override -
invalidateScopeData(
FocusScopeNode node) → void -
Clears the data associated with the given FocusScopeNode for this object.
override
-
next(
FocusNode currentNode) → bool -
Focuses the next widget in the focus scope that contains the given
currentNode
.inherited -
noSuchMethod(
Invocation invocation) → dynamic -
Invoked when a nonexistent method or property is accessed.
inherited
-
previous(
FocusNode currentNode) → bool -
Focuses the previous widget in the focus scope that contains the given
currentNode
.inherited -
sortDescendants(
Iterable< FocusNode> descendants, FocusNode currentNode) → Iterable<FocusNode> -
Sorts the given
descendants
into focus order.inherited -
toDiagnosticsNode(
{String? name, DiagnosticsTreeStyle? style}) → DiagnosticsNode -
Returns a debug representation of the object that is used by debugging
tools and by DiagnosticsNode.toStringDeep.
inherited
-
toString(
{DiagnosticLevel minLevel = DiagnosticLevel.info}) → String -
A string representation of this object.
inherited
-
toStringShort(
) → String -
A brief description of this object, usually just the runtimeType and the
hashCode.
inherited
Operators
-
operator ==(
Object other) → bool -
The equality operator.
inherited