evaluate method

  1. @override
Future<Evaluation> evaluate(
  1. WidgetTester tester
)
override

Evaluate whether the current state of the tester conforms to the rule.

Implementation

@override
Future<Evaluation> evaluate(WidgetTester tester) async {
  // Collate all evaluations into a final evaluation, then return.
  var result = const Evaluation.pass();
  final images = <ui.FlutterView, ui.Image>{};
  try {
    // Compute elements to be evaluated.
    final List<Element> elements = finder.evaluate().toList();
    final byteDatas = <ui.FlutterView, ByteData>{};

    for (final element in elements) {
      final ui.FlutterView view = tester.viewOf(
        find.byElementPredicate((Element e) => e == element),
      );
      final RenderView renderView = tester.binding.renderViews.firstWhere(
        (RenderView r) => r.flutterView == view,
      );
      final layer = renderView.debugLayer! as OffsetLayer;

      late final ui.Image image;
      late final ByteData byteData;

      // Obtain a previously rendered image or render one for a new view.
      await tester.binding.runAsync(() async {
        image = images[view] ??= await layer.toImage(
          renderView.paintBounds,
          // Needs to be the same pixel ratio otherwise our dimensions
          // won't match the last transform layer.
          pixelRatio: 1 / view.devicePixelRatio,
        );
        byteData = byteDatas[view] ??= (await image.toByteData())!;
      });

      result = result + _evaluateElement(element, byteData, image);
    }
  } finally {
    for (final ui.Image image in images.values) {
      image.dispose();
    }
  }
  return result;
}