0

就我而言,当我使用 时ExpansionPanelList,我需要检查面板内的小部件是否可见。

如果不可见,tester.tap(find.text('More Info'))将抛出异常:

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)

如何检查此小部件在测试中是否可见?

4

2 回答 2

1

处理这个问题的一个很好的方法是以单元测试的方式测试 UI。在 Android 中,我们有 Roboelectric——它非常有用。在 Flutter 中,小部件测试被烘焙到平台并且开箱即用。一个常见的小部件测试可能看起来像这样:

testWidgets('great widget test', (tester) async {
await tester.pumpWidget(new MyWidget());
final finder = find...
expect(finder, findsOneWidget);
}

你抽你的小部件;然后你会发现小部件是否包含文本/图像/图标/按钮并确认它是否正确显示。应用小部件更改需要提及的一个重要注意事项是,有时您会根据用户操作更改小部件。例如:当用户点击删除按钮时删除待办事项字段。

await tester.tap(find.byType(Checkbox));
// Rebuild the Widget after the state has changed
await tester.pump();

这仅在您更改小部件的状态并且需要重建它时才有效。它不会帮助您确定是否调用了按钮回调。

查找器选项

您可以通过多种方式找到目标小部件:

类型finder.byType

钥匙finder.byKey

文本finder.textfinder.widgetWithText

图标finder.byIcon

在您的测试中创建一个重复的小部件finder.byWidget

正则表达式finder.bySemanticsLabel

等等…finder.ancestorfinder.descendant

了解更多关于如何查找小部件的好方法是查看源代码。

于 2021-07-07T04:35:58.487 回答
0

RednerObject有一个名为_needsPaint及其 getter的属性debugNeedsPaint

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

但是当ExpansionPaneList再次关闭时,绘制状态仍然显示它已绘制。

于 2021-07-07T03:54:44.013 回答