我正在尝试在我的Flutter应用程序中判断应用是否运行在智能手机或平板电脑上,但是device_info
包只能告诉我们设备信息,不能判断设备是否为智能手机或平板电脑。是否有一种方法可以通过检查设备的大小来实现这一点?
非常感谢。 Mahi
我正在尝试在我的Flutter应用程序中判断应用是否运行在智能手机或平板电脑上,但是device_info
包只能告诉我们设备信息,不能判断设备是否为智能手机或平板电脑。是否有一种方法可以通过检查设备的大小来实现这一点?
非常感谢。 Mahi
// The equivalent of the "smallestWidth" qualifier on Android.
var shortestSide = MediaQuery.of(context).size.shortestSide;
// Determine if we should use mobile layout or not, 600 here is
// a common breakpoint for a typical 7-inch tablet.
final bool useMobileLayout = shortestSide < 600;
转自https://flutter.rocks/2018/01/28/implementing-adaptive-master-detail-layouts/
感谢@Sergi
550
而不是 600
作为魔数。这是因为该值取决于设备的方向而发生变化。我猜这是因为它只考虑了窗口空间,所以当设备处于横向方向时,状态栏和导航栏从最短的一侧获得了一些空间。因此,600
适用于普通平板电脑,但是当你转向像 Nexus 7 2012 这样的较小设备时,它会将其视为手机。 - Roc Boronat如果您无法访问BuildContext,则可以使用此选项。我从中删除了它。
String getDeviceType() {
final data = MediaQueryData.fromWindow(WidgetsBinding.instance.window);
return data.size.shortestSide < 600 ? 'phone' :'tablet';
}
550
作为魔术数字,而不是 600
。这是因为这个值取决于设备的方向。我猜这是因为它只考虑了窗口空间,所以当设备处于横向方向时,状态栏和导航栏会从最短的一边占用一些空间。所以,600
在常见的平板电脑上有效,但是当你使用像 Nexus 7 2012 这样的较小设备时,它会将其视为手机。 - Roc Boronat一种计算屏幕分辨率对角线的方法。
import 'package:flutter/widgets.dart';
import 'dart:math';
class TabletDetector {
// iPhone 6S
// |_ [portrait]
// |_ size: 375.0x667.0, pixelRatio: 2.0, pixels: 750.0x1334.0
// |_ diagonal: 765.1888655750291
// |_ [horizontal]
// |_ size: 667.0x375.0, pixelRatio: 2.0, pixels: 1334.0x750.0
// |_ diagonal: 765.1888655750291
// iPhone X
// |_ [portrait]
// |_ size: 375.0x812.0, pixelRatio: 3.0, pixels: 1125.0x2436.0
// |_ diagonal: 894.4098613052072
// |_ [horizontal]
// |_ size: 812.0x375.0, pixelRatio: 3.0, pixels: 2436.0x1125.0
// |_ diagonal: 894.4098613052072
// iPhone XS Max
// |_ [portrait]
// |_ size: 414.0x896.0, pixelRatio: 3.0, pixels: 1242.0x2688.0
// |_ diagonal: 987.0217829409845
// |_ [horizontal]
// |_ size: 896.0x414.0, pixelRatio: 3.0, pixels: 2688.0x1242.0
// |_ diagonal: 987.0217829409845
// iPad Pro (9.7-inch)
// |_ [portrait]
// |_ size: 768.0x1024.0, pixelRatio: 2.0, pixels: 1536.0x2048.0
// |_ diagonal: 1280.0
// |_ [horizontal]
// |_ size: 1024.0x768.0, pixelRatio: 2.0, pixels: 2048.0x1536.0
// |_ diagonal: 1280.0
// iPad Pro (10.5-inch)
// |_ [portrait]
// |_ size: 834.0x1112.0, pixelRatio: 2.0, pixels: 1668.0x2224.0
// |_ diagonal: 1390.0
// |_ [horizontal]
// |_ size: 1112.0x834.0, pixelRatio: 2.0, pixels: 2224.0x1668.0
// |_ diagonal: 1390.0
// iPad Pro (12.9-inch)
// |_ [portrait]
// |_ size: 1024.0x1366.0, pixelRatio: 2.0, pixels: 2048.0x2732.0
// |_ diagonal: 1707.2000468603555
// |_ [horizontal]
// |_ size: 1366.0x1024.0, pixelRatio: 2.0, pixels: 2732.0x2048.0
// |_ diagonal: 1707.2000468603555
static bool isTablet(MediaQueryData query) {
var size = query.size;
var diagonal = sqrt(
(size.width * size.width) +
(size.height * size.height)
);
/*
print(
'size: ${size.width}x${size.height}\n'
'pixelRatio: ${query.devicePixelRatio}\n'
'pixels: ${size.width * query.devicePixelRatio}x${size.height * query.devicePixelRatio}\n'
'diagonal: $diagonal'
);
*/
var isTablet = diagonal > 1100.0;
return isTablet;
}
}
MediaQueryData.fromWindow(WidgetsBinding.instance!.window)
公开了一个无参数方法。在这里学到了一些东西。我是从Swift领域转过来,在Dart池中试水。 - Nick NiOS明确区分手机和平板电脑,而在安卓中并没有这种情况。您需要根据屏幕宽度选择。
查看本文以查看一个示例如何区分:https://flutter.rocks/2018/01/28/implementing-adaptive-master-detail-layouts/
这里与其他答案相同,但返回enum
而不是bool
或String
。由于它更封闭,使用起来更容易。
import 'package:flutter/widgets.dart';
enum DeviceType { Phone, Tablet }
DeviceType getDeviceType() {
final data = MediaQueryData.fromWindow(WidgetsBinding.instance.window);
return data.size.shortestSide < 550 ? DeviceType.Phone : DeviceType.Tablet;
}
感谢 @Chandler 和 @bakua 的启发 :·)
550
而不是600
。这是因为该值取决于设备的方向而发生变化。我猜这是因为它只考虑了窗口空间,所以当设备处于横向时,状态栏和导航栏从最短的一侧获得了一些空间。因此,600
适用于普通平板电脑,但当您转向像Nexus 7 2012这样的较小设备时,它会将其视为手机。在这种情况下,当设备处于横向时,最短的一侧为552
。因此,550
成为新的魔数! - Roc Boronat针对 Android,正如 @Chandler 所说,你应该检查屏幕的最小尺寸,但是对于 iOS,你可以使用 device_info 包来100%准确地识别是否为 iPad:
在pubspec.yaml
中添加:
device_info: ^0.4.2+4
static Future<bool> isTablet(BuildContext context) async {
if (Platform.isIOS) {
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
IosDeviceInfo iosInfo = await deviceInfo.iosInfo;
return iosInfo.model.toLowerCase() == "ipad";
} else {
// The equivalent of the "smallestWidth" qualifier on Android.
var shortestSide = MediaQuery.of(context).size.shortestSide;
// Determine if we should use mobile layout or not, 600 here is
// a common breakpoint for a typical 7-inch tablet.
return shortestSide > 600;
}
}
bool get isTablet {
final firstView = WidgetsBinding.instance.platformDispatcher.views.first;
final logicalShortestSide = firstView.physicalSize.shortestSide / firstView.devicePixelRatio;
return logicalShortestSide > 600;
}
DeviceType.tablet
。您需要执行以下操作:SizerUtil.deviceType == DeviceType.tablet
bool isTablet;
double ratio = MediaQuery.of(context).size.width / MediaQuery.of(context).size.height;
if( (ratio >= 0.74) && (ratio < 1.5) )
{
isTablet = true;
} else{
isTablet = false;
}
class DeviceUtil {
static String get _getDeviceType {
final data = MediaQueryData.fromWindow(WidgetsBinding.instance.window);
return data.size.shortestSide < 550 ? 'phone' : 'tablet';
}
static bool get isTablet {
return _getDeviceType == 'tablet';
}
}
使用方法:
DeviceUtil.isTablet; //true