1. override
void dispatchEvent(PointerEvent event, HitTestResult result)

Handler for device events caught by the binding in live test mode.

Source

@override
void dispatchEvent(PointerEvent event, HitTestResult result) {
  if (event is PointerDownEvent) {
    final RenderObject innerTarget = result.path.firstWhere(
      (HitTestEntry candidate) => candidate.target is RenderObject,
      orElse: () => null
    )?.target;
    if (innerTarget == null)
      return null;
    final Element innerTargetElement = collectAllElementsFrom(binding.renderViewElement, skipOffstage: true)
      .lastWhere((Element element) => element.renderObject == innerTarget);
    final List<Element> candidates = <Element>[];
    innerTargetElement.visitAncestorElements((Element element) {
      candidates.add(element);
      return true;
    });
    assert(candidates.isNotEmpty);
    String descendantText;
    int numberOfWithTexts = 0;
    int numberOfTypes = 0;
    int totalNumber = 0;
    debugPrint('Some possible finders for the widgets at ${binding.globalToLocal(event.position)}:');
    for (Element element in candidates) {
      if (totalNumber > 10)
        break;
      totalNumber += 1;

      if (element.widget is Text) {
        assert(descendantText == null);
        final Text widget = element.widget;
        final Iterable<Element> matches = find.text(widget.data).evaluate();
        descendantText = widget.data;
        if (matches.length == 1) {
          debugPrint('  find.text(\'${widget.data}\')');
          continue;
        }
      }

      if (element.widget.key is ValueKey<dynamic>) {
        final ValueKey<dynamic> key = element.widget.key;
        String keyLabel;
        if ((key is ValueKey<int> ||
             key is ValueKey<double> ||
             key is ValueKey<bool>)) {
          keyLabel = 'const ${element.widget.key.runtimeType}(${key.value})';
        } else if (key is ValueKey<String>) {
          keyLabel = 'const ${element.widget.key.runtimeType}(\'${key.value}\')';
        }
        if (keyLabel != null) {
          final Iterable<Element> matches = find.byKey(key).evaluate();
          if (matches.length == 1) {
            debugPrint('  find.byKey($keyLabel)');
            continue;
          }
        }
      }

      if (!_isPrivate(element.widget.runtimeType)) {
        if (numberOfTypes < 5) {
          final Iterable<Element> matches = find.byType(element.widget.runtimeType).evaluate();
          if (matches.length == 1) {
            debugPrint('  find.byType(${element.widget.runtimeType})');
            numberOfTypes += 1;
            continue;
          }
        }

        if (descendantText != null && numberOfWithTexts < 5) {
          final Iterable<Element> matches = find.widgetWithText(element.widget.runtimeType, descendantText).evaluate();
          if (matches.length == 1) {
            debugPrint('  find.widgetWithText(${element.widget.runtimeType}, \'$descendantText\')');
            numberOfWithTexts += 1;
            continue;
          }
        }
      }

      if (!_isPrivate(element.runtimeType)) {
        final Iterable<Element> matches = find.byElementType(element.runtimeType).evaluate();
        if (matches.length == 1) {
          debugPrint('  find.byElementType(${element.runtimeType})');
          continue;
        }
      }

      totalNumber -= 1; // if we got here, we didn't actually find something to say about it
    }
    if (totalNumber == 0)
      debugPrint('  <could not come up with any unique finders>');
  }
}