我已经将PageView
小部件包装在Listener
小部件内。我在那里检查onPointerSignal
属性是否pointerSignal
是PointerScrollEvent
,以检测用户是否使用鼠标滚轮在小部件上滚动。然后,它不会产生怪异的行为,而是会产生I animateToPage
,并将PageView的physics
属性设置为NeverScrollableScrollPhysics()
,以免干扰animateToPage
的过渡。
那真的很酷!通过移动鼠标滚轮,它可以以平滑的动画从一页跳到另一页。
但是,通过小部件测试来测试行为时会很有趣。有人知道如何发出/发送PointerScrollEvent
吗?我已经尝试了以下方法,但没有成功。
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);
},
);
}
答案 0 :(得分:0)
最后,我找到了一种方法。颤动测试启发了我: 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);
},
);
}