12

In my case, when I using ExpansionPanelList, I need to check widget inside panel is visible.

If not visible, tester.tap(find.text('More Info')) will throw exception:

Warning: A call to tap() with finder "exactly one widget with text "More Info" (ignoring offstage widgets): Text("More Info", dependencies: [MediaQuery, DefaultTextStyle])" derived an Offset (Offset(400.0, 641.8)) that would not hit test on the specified widget. Maybe the widget is actually off-screen, or another widget is obscuring it, or the widget cannot receive pointer events. Indeed, Offset(400.0, 641.8) is outside the bounds of the root of the render tree, Size(800.0, 600.0). The finder corresponds to this RenderBox: RenderParagraph#1b6b1 relayoutBoundary=up27 The hit test result at that offset is: HitTestResult(HitTestEntry#b18dd(RenderView#408c3), HitTestEntry#a2393()) #0 WidgetController._getElementPoint (package:flutter_test/src/controller.dart:953:25) #1 WidgetController.getCenter (package:flutter_test/src/controller.dart:836:12) #2 WidgetController.tap (package:flutter_test/src/controller.dart:271:18) #3 main. (file:///Users/tommy/Repos/surveyapp/survey/test/widget_test.dart:99:18)

How do I check this widget is visible in testing?

2 Answers 2

29

Use hitTestable(), which produces a finder which only matches if the widget described by your finder is truly visible on the screen. For example:

  expect(find.text('More Info').hitTestable(), findsOneWidget);

In your case, you may need to wait until the ExpansionPanelList expands or the list scrolls into view. You may need to use pumpSettle() or ensureVisible() first.

Sign up to request clarification or add additional context in comments.

1 Comment

Perfect answer! :)
1

RednerObject has a property called _needsPaint and its getter debugNeedsPaint, when this object is visible it should be true.

final targetWidget = find.text('More Info').evaluate().first;
expect(targetWidget.renderObject!.debugNeedsPaint, isTrue);

But when ExpansionPanelList close again, the paint state is still showing it has been paint.


Another work around is that you can ignore the warning and check the side affect.

For example, when tap the hidden widget, it should pop up some view with text Hello World:

await tester.tap(find.text('More Info'), warnIfMissed: false);
expect(find.text('Hello World'), findsOneWidget);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.