我有一个示例代码,可以检测悬停在小部件上的手写笔。
代码来自这个 Stackoverflow 问题。
简而言之。它使用
GestureBinding.instance?.pointerRouter.addGlobalRoute
进行绑定,并在处理程序中检查事件是否属于手写笔类型。
当手写笔悬停在屏幕上(无接触)时会触发此操作。
它非常适合
Text()
、Container()
等小部件。
InAppWebView
上使用此功能,但直到笔与表面接触后才会触发该事件。即使在容器上,如果子级是 InAppWebView
,它也不起作用。
我想这个问题也会出现在其他Widget上。
我尝试了
Listener
、AbsorbPointer
和IgnorePointer
。
当我开始将触控笔悬停在屏幕上时,我可以在调试输出中看到以下内容。
I/ViewRootImpl(23491): updatePointerIcon pointerType = 20001, calling pid = 23491
D/InputManager(23491): setPointerIconType iconId = 20001, callingPid = 23491
InAppWebView 有一个选项
useHybridComposition
,默认为 false
。将其设置为 true
可以解决该问题。但是 WebView 变得非常慢。
谢谢!
如下所述,这个问题有两种解决方案。
将
useHybridComposition
设置为 true。对于缓慢的情况,也许可以向该存储库提出问题。
在 android/ios 级别而不是 Flutter 级别进行挂钩,并将事件转发回 Flutter。
调试方法可能是这样的:首先,在像你的
_handleEvent
这样的方法中打印出指针事件。然后你就会知道指针事件是刚刚发生,还是根本没有发生。
其次,尝试哪些小部件可以,哪些不可以。文本可以,WebView 不行。那么Container可以吗? InkWell 还好吗?图标按钮可以吗?图标按钮可以吗?等等。通过这样做,您可以深入了解文本的特殊之处,使其发挥作用。
第三,作为一个hacky解决方法,你能尝试一下吗
Text.rich(WidgetSpan(child: your_web_view))
?既然你说文本可以,而其他小部件则不行。
最后,也许需要深入研究 Text 的源代码,看看会发生什么神奇的事情 - 可能是一些特殊的配置? - 让它发挥作用。