首页 > 解决方案 > 如何在颤动小部件测试中测试鼠标滚动事件?

问题描述

我已经将小部件包装在PageViewListener部件中。在那里我检查onPointerSignal属性是否pointerSignal检测PointerScrollEvent用户是否使用鼠标滚轮在小部件上滚动。然后,它不会产生奇怪的行为,而是将 PageView 的属性设置为,animateToPage这样它就不会干扰转换。physicsNeverScrollableScrollPhysics()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);
    },
  );
}

标签: flutterflutter-test

解决方案


最后,我找到了一种方法。这个颤振测试启发了我: 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);
    },
  );
}

推荐阅读