sort static method

Iterable<FocusNode> sort(
  1. Iterable<FocusNode> nodes
)

Sorts the input focus nodes into reading order.

Implementation

static Iterable<FocusNode> sort(Iterable<FocusNode> nodes) {
  if (nodes.length <= 1) {
    return nodes;
  }

  final List<_ReadingOrderSortData> data = <_ReadingOrderSortData>[
    for (final FocusNode node in nodes) _ReadingOrderSortData(node),
  ];

  final List<FocusNode> sortedList = <FocusNode>[];
  final List<_ReadingOrderSortData> unplaced = data;

  // Pick the initial widget as the one that is at the beginning of the band
  // of the topmost, or the topmost, if there are no others in its band.
  _ReadingOrderSortData current = _pickNext(unplaced);
  sortedList.add(current.node);
  unplaced.remove(current);

  // Go through each node, picking the next one after eliminating the previous
  // one, since removing the previously picked node will expose a new band in
  // which to choose candidates.
  while (unplaced.isNotEmpty) {
    final _ReadingOrderSortData next = _pickNext(unplaced);
    current = next;
    sortedList.add(current.node);
    unplaced.remove(current);
  }
  return sortedList;
}