有没有一种方法可以模拟对小部件或屏幕上特定位置的触摸?

3
我希望能够在小部件的某个位置进行触摸或轻敲,而不需要用户显式地在该点触摸屏幕。有没有方法可以做到这一点?
我已经查看了SO答案,并且有些人建议使用“集成测试”,但是在没有与笔记本电脑物理或以某种方式连接的设备上无法执行此操作(找不到更好的措辞)。
我还尝试进行hitTest,想知道它是否实际触摸或轻敲了该点,同时与UI交互,但似乎并没有。
              onPressed: () {
                    RenderObject? rb = context.findRenderObject();
                    if (rb is RenderBox){
                      final hit = BoxHitTestResult();
                      if (rb.hitTest(hit, position: Offset(300,500))){
                        print(hit.path);
                      }
                    }
                  },

此外,请确保正确理解问题,因为在我阅读有关我的查询的许多答案中,很多人都回答说“你不需要它,只需调用函数/方法”。我想要在屏幕上模拟对特定指定位置的轻按,也许根据我在代码中尝试的X、Y轴。

非常感谢任何方向。

如果我的问题有任何缺失,请告诉我。

编辑:(以下是我发现的更新内容)

我深入研究了Flutter代码。我找到了一些文件: 在flutter/src/gestures/hit_test.dart下,我发现void handleEvent(PointerEvent event, HitTestEntry entry);。我假设它会消耗一个PointerEvent。进一步检查, 在flutter/src/gestures/events.dart下,我找到class PointerDownEvent extends PointerEvent,在flutter_test/src/test_pointer.dart 我找到class TestPointer

这些文件中的任何一个能为我想要做的事情提供任何启示吗?我正在检查中。


其次,我想问一下,有没有什么“应用开发软件”?在一个帖子中同时提出多个问题并寻求软件推荐是被关闭问题的好办法 :) 请一次只提一个问题,并且不要寻求软件推荐。 - a_local_nobody
你是指像这样的解决方法吗:Timer(Duration(seconds: 3), () { WidgetsBinding.instance!.handlePointerEvent(PointerDownEvent(pointer: 0, position: Offset(100, 100),)); WidgetsBinding.instance!.handlePointerEvent(PointerUpEvent(pointer: 0,position: Offset(100, 100),)); }); - 当然,这两个构造函数应该添加更多属性以使其在大多数情况下正常工作。 - pskink
@a_local_nobody 好的^^ 已经移除了! - Neo00
我给了你一段代码,用于模拟简单的GestureDetector.onTap事件 - 通过处理指针按下事件后跟随指针抬起事件来完成,只需添加一些GestureDetector并检查它即可。 “另外,您说的两个构造函数都应该添加更多属性才能在大多数情况下正常工作是什么意思?”- 我不知道,也许需要timeStamp?现在它设置为这个值。 - pskink
@pskink非常感谢。 我实际上没有预料到WidgetsBinding是..可能是屏幕上所有小部件的一个实例,不知道更好的措辞。我期望它是某个小部件下的子级,并考虑了一些可能的复杂情况,但它像预期的那样工作得很好。我还将此编写为对我的问题的回答。非常感谢。 - Neo00
显示剩余3条评论
1个回答

3
感谢 @pskink,以下代码对我/这种情况最有效。我已经能够按照所需制作标签页。非常感谢。
WidgetsBinding.instance!.handlePointerEvent(PointerDownEvent(pointer: 0, position: Offset(100, 100),)); WidgetsBinding.instance!.handlePointerEvent(PointerUpEvent(pointer: 0,position: Offset(100, 100),));

如果这个解决方法解决了你的问题,请将其标记为已接受,以帮助其他人知道它。 - Mohammad
1
@Mohammad SO说我需要等待“2”天才能接受自己的答案,因此现在无法操作。我之前也尝试过。 - Neo00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接