Flutter 通过 Widget 检测 PointerEvents

dkn*_*ack 11 flutter flutter-layout flutter-inappwebview

我有一个示例代码,可以检测悬停在小部件上的手写笔。

代码来自这个 Stackoverflow Question

简而言之。GestureBinding.instance?.pointerRouter.addGlobalRoute如果事件属于手写笔类型,它会使用绑定并检查处理程序。当手写笔悬停在屏幕上(无接触)时会触发此操作。

它在诸如等小部件上效果很好Text()Container()

问题:

我想在不同的 Widget(Flutter)上使用此功能,InAppWebView但直到笔与表面接触后才会触发该事件。即使在容器上它也不起作用,如果孩子是InAppWebView.

我认为这个问题在其他 Widget 上也会出现。

我尝试了Listener,AbsorbPointerIgnorePointer.

更新1:

当我开始将触控笔悬停在屏幕上时,我可以在调试输出中看到以下内容。

I/ViewRootImpl(23491): updatePointerIcon pointerType = 20001, calling pid = 23491
D/InputManager(23491): setPointerIconType iconId = 20001, callingPid = 23491
Run Code Online (Sandbox Code Playgroud)

更新2:

InAppWebView 有一个useHybridComposition默认false选项。设置一下即可true解决问题。但是 WebView 变得非常慢。

这是显示问题的存储库。

谢谢!

fzy*_*cjy 1

如下所述,这个问题有两种解决方案。

  1. 设置useHybridComposition为真。对于缓慢的情况,也许可以向该存储库提出问题。

  2. 在 android/ios 级别而不是 Flutter 级别进行挂钩,并将事件转发回 Flutter。


调试方法可能是这样的:首先,打印出像你的_handleEvent. 然后你就会知道指针事件是刚刚发生,还是根本没有发生。

其次,尝试哪些小部件可以,哪些不可以。文本可以,WebView 不行。那么Container可以吗?InkWell 还好吗?图标按钮可以吗?图标按钮可以吗?通过这样做,您可以深入了解文本的特殊之处,使其发挥作用。

第三,作为一个hacky解决方法,你能尝试一下吗Text.rich(WidgetSpan(child: your_web_view))?既然你说文本可以,而其他小部件则不行。

最后,也许需要深入研究 Text 的源代码,看看会发生什么神奇的事情 - 可能是一些特殊的配置?- 让它发挥作用。