evaluate method
- 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;
}