如何检查设备是触摸设备还是鼠标设备?
使用kIsWeb是不够的,因为如果在移动设备上使用Web版本的应用程序,kIsWeb返回true,但我需要它返回false,因为它是一个触摸设备。
检查平台也不起作用,因为如果在iOS设备上使用应用的Web版本,例如iOS平台检查返回false。
用例-我的应用有两种不同类型的视频播放器。一种适用于触摸设备(点击显示和隐藏控件),另一种适用于鼠标设备(鼠标进入播放器时控件显示,鼠标退出时控件隐藏)。
YouTube也有同样的想法。如果我在iPhone上使用YouTube应用程序或网站,我就可以获得触摸控制。如果我在iPad Pro上使用YouTube应用程序或网站,我就可以获得触摸控制。如果我在Mac上使用YouTube网站,我就可以在所有屏幕大小(甚至是移动的屏幕大小)上获得鼠标控制。
所以我想我真的只需要知道网络上的平台。如果不是在网络上,我可以得到平台。
3条答案
按热度按时间ebdffaop1#
很好的问题@jwasher!我有同样的问题-一个基于触摸和滑动的UI,作为一个本地移动的应用程序是很好的,作为一个移动网络浏览器上的单页网络应用程序(SPA)是很好的,但当SPA用于桌面网络浏览器时,基于鼠标的交互是奇怪和笨重的。
我已经确定的解决方案是将敏感的小部件 Package 在MouseRegion(https://api.flutter.dev/flutter/widgets/MouseRegion-class.html)中,以在运行时检测鼠标活动,然后通过使用按钮扩展UI来做出React,以提供一种以鼠标为中心的方式来触发以前仅链接到触摸触发器的操作。
您可以使用它来“启用鼠标”单个小部件,或者您可以将整个应用程序 Package 在一个MouseRegion中,在检测到活动时跳转一个状态字段,然后以一种完全不同的方式为点击用户重建小部件树。
这种策略可能会在永远不会连接鼠标的设备(如智能手机)上带来一些轻微的复杂性/CPU开销,但该解决方案比构建或配置时功能确定更灵活。如果用户在平板电脑上启动应用,然后将其放在支架上并连接蓝牙鼠标,它会做出适当的React。
mznpcxlj2#
设备不是“鼠标设备”或“指针设备”。* 事件 * 有输入类型--参见Pointer event.kind--但不是整个设备。笔记本电脑可以有触摸屏,平板电脑可以有手写笔或外部鼠标;在这些环境中运行的应用程序可以接收这两种类型的事件。
如果不知道使用这种分类要达到什么目的,就很难建议如何实现它。例如,尝试根据对主要交互模式的猜测来设计UI的样式,这与对鼠标事件和触摸事件做出不同的React是完全不同的问题。
nbewdwxp3#
你也可以用
Theme.of(context).platform
来获得TargetPlatform
。即使是在网络上,它也会给予你底层平台,比如说,即使在Android浏览器上运行,它也会给你TargetPlatform.android
。然后,由于在大多数情况下触摸操作系统和非触摸操作系统是分开的,你会得到一个很好的近似值:Android、iOS和Fushia将是基于触摸屏的,而Linux、Windows和MacOS将是基于鼠标的。当然,也有一些边缘设备,比如Surface设备上的Windows,但总的来说,这些混合设备无论如何都接受鼠标(大多数人都用鼠标)。所以对我来说,这是一个很好的近似,它可以在网络和移动的上使用。