在Flutter中,如何检查鼠标设备或触摸设备?

时间:2020-08-09 14:57:30

标签: flutter dart

如何检查设备是触摸设备还是鼠标设备?

使用kIsWeb是不够的,因为如果在移动设备上使用Web版本的应用程序,则kIsWeb返回true,但是我需要它返回false,因为它是触摸设备。

检查平台也不起作用,因为例如,如果在iOS设备上使用Web版本的应用程序,则iOS平台检查返回false。

用例-我的应用有两种不同类型的视频播放器。一种适用于触摸设备(点击以显示和隐藏控件),另一种适用于鼠标设备(控件在您滑入播放器时显示,而在您滑出播放器时隐藏)。

Youtube有相同的想法。如果我在iPhone上使用youtube应用或网站,则会获得触摸控制。如果我在iPad Pro上使用youtube应用或网站,则会获得触摸控制。如果我在Mac上使用youtube网站,则可以使用所有屏幕尺寸(甚至手机屏幕尺寸)的鼠标控件。

所以我想我真的只需要了解网络平台。如果没有网络,我可以得到平台。

4 个答案:

答案 0 :(得分:2)

好问题@jwasher!我遇到了同样的问题-一个基于触摸和滑动的UI,它像本机移动应用程序一样棒,在移动Web浏览器中也像单页Web应用程序(SPA)一样棒,但是当SPA出现时,对于基于鼠标的交互来说这既奇怪又笨拙在桌面网络浏览器中使用。

我确定的解决方案是将敏感的小部件包装在MouseRegion(https://api.flutter.dev/flutter/widgets/MouseRegion-class.html)中,以在运行时检测鼠标活动,然后通过使用按钮扩展UI来做出反应,从而提供以前仅以鼠标为中心的触发动作的方式链接到触摸触发器。

您可以使用它来“启用鼠标”单个小部件,也可以将整个应用程序包装在MouseRegion中,在检测到活动时触发状态字段,然后以完全不同的方式为指向和单击用户重建小部件树

此策略可能会给永远不会连接鼠标的设备(例如智能手机)带来一些较小的复杂性/ CPU开销,但是该解决方案比确定构建时间或配置时间能力更灵活。如果用户在平板电脑上启动该应用程序,则将其放在支架上并连接蓝牙鼠标-它会做出适当的反应。

答案 1 :(得分:1)

您不能直接执行此操作,但是可以找到可以告诉您设备类型的屏幕尺寸。

DeviceScreenType getDeviceType(BuildContext context) {
  double deviceWidth = MediaQuery.of(context).size.shortestSide;

  if (deviceWidth > 950) {
    return DeviceScreenType.Desktop;
  }

  if (deviceWidth > 600) {
    return DeviceScreenType.Tablet;
  }

  return DeviceScreenType.Mobile;
}

DeviceScreenType只是我创建的一个自定义枚举。

因此,如果返回桌面,则它是鼠标设备而不是触摸设备。

答案 2 :(得分:1)

您可以使用Platform Class库中的dart:io

    if (Platform.isAndroid) {
      print('android');
    }
    if (Platform.isIOS) {
      print('ios');
    }
    if (Platform.isMacOS) {
      print('mac');
    }
    if (Platform.isWindows) {
      print('windows');
    }

答案 3 :(得分:1)

设备不是“鼠标设备”或“指针设备”。 事件具有输入类型(请参见Pointer event.kind),而不是整个设备。笔记本电脑可以带有触摸屏,而平板电脑可以带有手写笔或外接鼠标。在这些环境中运行的应用程序可以接收两种类型的事件。

在不知道要使用此分类完成什么的情况下,很难就如何完成分类提出建议。例如,尝试基于对主要交互模式的猜测来设计UI的样式,完全不同于对鼠标事件和触摸事件的反应。