Flutter 检测 Widget 上的 PointerEvents

问题描述 投票:0回答:1

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

代码来自这个 Stackoverflow 问题

简而言之。它使用

GestureBinding.instance?.pointerRouter.addGlobalRoute
进行绑定,并在处理程序中检查事件是否属于手写笔类型。 当手写笔悬停在屏幕上(无接触)时会触发此操作。

它非常适合

Text()
Container()
等小部件。

问题:

我想在不同的小部件 Flutter

InAppWebView
上使用此功能,但直到笔与表面接触后才会触发该事件。即使在容器上,如果子级是
InAppWebView
,它也不起作用。

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

我尝试了

Listener
AbsorbPointer
IgnorePointer

更新1:

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

I/ViewRootImpl(23491): updatePointerIcon pointerType = 20001, calling pid = 23491
D/InputManager(23491): setPointerIconType iconId = 20001, callingPid = 23491

更新2:

InAppWebView 有一个选项

useHybridComposition
,默认为
false
。将其设置为
true
可以解决该问题。但是 WebView 变得非常慢。

这里是显示问题的存储库。

谢谢!

flutter flutter-layout flutter-inappwebview
1个回答
1
投票

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

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

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


调试方法可能是这样的:首先,在像你的

_handleEvent
这样的方法中打印出指针事件。然后你就会知道指针事件是刚刚发生,还是根本没有发生。

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

第三,作为一个hacky解决方法,你能尝试一下吗

Text.rich(WidgetSpan(child: your_web_view))
?既然你说文本可以,而其他小部件则不行。

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

© www.soinside.com 2019 - 2024. All rights reserved.