flutter - 如何在颤动小部件测试中测试鼠标滚动事件?
问题描述
我已经将小部件包装在PageView
小Listener
部件中。在那里我检查onPointerSignal
属性是否pointerSignal
检测PointerScrollEvent
用户是否使用鼠标滚轮在小部件上滚动。然后,它不会产生奇怪的行为,而是将 PageView 的属性设置为,animateToPage
这样它就不会干扰转换。physics
NeverScrollableScrollPhysics()
animateToPage
这真的很酷!它通过移动鼠标滚轮以流畅的动画从一页跳到另一页。
但是,通过小部件测试来测试行为时会很有趣。有人知道如何发出/调度 aPointerScrollEvent
吗?我已经尝试了以下但没有任何成功。
void main() {
testWidgets(
'when mouse wheel moved forward then next page is shown',
(WidgetTester tester) async {
await tester.pumpWidget(
Test(
child: PointerAwarePageView(
children: [
Text('1'),
Text('2'),
],
),
),
);
expect(find.text('1'), findsOneWidget);
tester.dispatchEvent(
PointerScrollEvent(scrollDelta: Offset(0.0, 1.0)),
HitTestResult(),
);
await tester.pump(Duration(seconds: 3));
expect(find.text('2'), findsOneWidget);
},
);
}
解决方案
最后,我找到了一种方法。这个颤振测试启发了我: https ://github.com/flutter/flutter/blob/master/packages/flutter/test/widgets/scrollable_test.dart#L316
我们需要创建一个TestPointer
带有鼠标的设备类型并执行滚动。然后发送事件WidgetTester
。
我将在这里写下我的工作结果测试:
void main() {
testWidgets(
'when mouse wheel is scrolled then next page is shown',
(WidgetTester tester) async {
await tester.pumpWidget(
Test(
child: PointerAwarePageView(
children: [
Text('1'),
Text('2'),
],
),
),
);
expect(find.text('1'), findsOneWidget);
final Offset scrollEventLocation = tester.getCenter(find.byType(PointerAwarePageView));
final TestPointer testPointer = TestPointer(1, PointerDeviceKind.mouse);
testPointer.hover(scrollEventLocation);
final HitTestResult result = tester.hitTestOnBinding(scrollEventLocation);
await tester.sendEventToBinding(testPointer.scroll(const Offset(0.0, 1.0)), result);
await tester.pumpAndSettle();
expect(find.text('2'), findsOneWidget);
},
);
}
推荐阅读
- java - 加载外部文件作为资源
- python - open3d 中的 pointcloud2 流可视化或其他在 python 中可视化 pointcloud2 的可能性
- ssh - 如何在从 VS 代码 ssh 时以 root 身份从远程服务器编辑文件?
- python - python可以从C头文件中加载定义吗?
- angular - NgRx Data - 如何以类型安全的方式连接到 addOne 成功操作?
- apache - 火狐返回 SSL_ERROR_BAD_MAC_READ
- android - 如何通过wifi在同一网络的应用程序之间进行通信?
- yii2 - 带有“无效段”的 Newrelic 代理跟踪失败
':停止时间(0)之后的开始时间(#####)` - javascript - 单击输入字段的填充将光标设置在行首,而不是行尾
- jdbc - 通过 Simba 的 JDBC 驱动程序执行涉及 MD5() 函数的查询时出错