closestVisibleWidgetIds method

List<String> closestVisibleWidgetIds(
  1. String target, {
  2. int limit = 5,
})

Implementation

List<String> closestVisibleWidgetIds(String target, {int limit = 5}) {
  final targetTokens = _idTokens(target);
  if (targetTokens.isEmpty) return const [];

  final scored = <({String id, int score})>[];
  for (final id in _visibleWidgetIds()) {
    if (id == target) continue;
    final candidateTokens = _idTokens(id);
    var score = 0;
    for (final token in targetTokens) {
      if (candidateTokens.contains(token)) {
        score += 3;
      } else if (candidateTokens.any(
        (candidate) =>
            candidate.startsWith(token) || token.startsWith(candidate),
      )) {
        score += 1;
      }
    }
    if (score > 0) scored.add((id: id, score: score));
  }

  scored.sort((a, b) {
    final score = b.score.compareTo(a.score);
    if (score != 0) return score;
    return a.id.compareTo(b.id);
  });
  return scored.take(limit).map((match) => match.id).toList();
}