在Flutter测试中查找CustomScrollView内部的小部件




我在尝试测试Flutter应用程序时遇到错误。我有一个自定义小部件,它位于CustomScrollView小部件的底部(第一个视口之外(。在我的测试中,我想验证它是否真的存在
我已经尝试过使用WidgetTester.scrollUntilVisibleWidgetTester.drag(就像在颤振框架的测试中一样(。此外,我还尝试用FlutterDriver重构我的测试,它只是把其他一切都搞砸了
如何在测试中滚动到CustomScrollView的底部
此最小复制显示包含CustomScrollView的应用程序,该应用程序具有一个屏幕高度的Container小部件(因此我想查找的小部件不在初始视图中(

void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: CustomScrollView(
slivers: [
SliverToBoxAdapter(
child: Container(
height: MediaQuery.of(context).size.height,
),
),
MyWidget(),
],
)),
);
}
}
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return SliverToBoxAdapter(
child: Container(
height: 100,
width: 100,
),
);
}
}

这是我最初为查找小部件而编写的测试,当然失败了。

void main() {
testWidgets('main contains mywidget', (WidgetTester tester) async {
// arange
await tester.pumpWidget(MyApp());
// act
final myWidget = find.byType(MyWidget);
// assert
expect(myWidget, findsOneWidget);
});
}

在这次迭代中,我使用了WidgetTester.scrollUntilVisible函数,但得到了以下错误。

void main() {
testWidgets('main contains mywidget', (WidgetTester tester) async {
// arange
await tester.pumpWidget(MyApp());
// act
final myWidget = find.byType(MyWidget);
final customScrollView = find.byType(CustomScrollView);
await tester.scrollUntilVisible(myWidget, 100,
scrollable: customScrollView);
await tester.pump();
// assert
expect(myWidget, findsOneWidget);
});
}
══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞════════════════════════════════════════════════════
The following _CastError was thrown running a test:
type 'CustomScrollView' is not a subtype of type 'Scrollable' in type cast
When the exception was thrown, this was the stack:
#0      WidgetController.widget (package:flutter_test/src/controller.dart:66:44)
#1      WidgetController.scrollUntilVisible.<anonymous closure> (package:flutter_test/src/controller.dart:995:15)
#2      WidgetController.scrollUntilVisible.<anonymous closure> (package:flutter_test/src/controller.dart:993:39)
#5      TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:72:41)
#6      WidgetController.scrollUntilVisible (package:flutter_test/src/controller.dart:993:27)
#7      main.<anonymous closure> (file:///C:/Users/X/test_example/test/main_test.dart:12:18)
<asynchronous suspension>
<asynchronous suspension>
(elided 3 frames from dart:async and package:stack_trace)

我很感激关于如何解决此问题并成功测试我的CustomScrollView的任何帮助或建议

我也遇到了同样的问题,最终我使用了dragUntilVisible((方法而不是scrollUntilVisible。

向下滚动直到小部件可见的示例:

await tester.dragUntilVisible(myWidget, customScrollView, Offset(0, -500));

只需使用">等待tester.ensureVisible(find.byKey(Key("Key_of_the_element"((";敲击之前。它将滚动,直到给定的元素可见。它比dragUntilVisible或scrollUntilVisiible更好,因为drageUntilVisble不适用于非渲染框窗口小部件,而scrollUnutilVisible则不适用于不可滚动的窗口小部件。

:flaft_test/src/controller.dart

Future ensureVisible(Finder-Finder(
包含类:WidgetController
类型:Future Function(Finder(
给定Finder指定的小部件W及其祖先树中的可滚动小部件S,这会滚动S以使W可见。通常,此方法的查找器应标记为skipOffstage: false,以便查找器正确处理屏幕外的小部件。当S足够长,W离S的显示部分足够远,并且S还没有缓存W的元素时,这是不起作用的。在这种情况下,请考虑使用scrollUntilVisible。另请参阅:Scrollable.ensureVisible,它是用于实现此方法的生产API。

最新更新