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