对于在iOS和Android上略有不同的UI,即在不同的平台上,必须有一种方法来检测应用程序在哪个平台上运行,但我在文档中找不到它。是什么?
当前回答
虽然defaultTargetPlatform可以工作,但我建议使用Theme.of(context). targetplatform。这样可以测试iOS行为(因为defaultTargetPlatform总是TargetPlatform)。Android正在测试中)。它还允许小部件的祖先通过将其包装在Theme小部件中来覆盖其目标平台。
其他回答
最“扑”的答案如下:
import 'package:flutter/foundation.dart' show TargetPlatform;
//...
if(Theme.of(context).platform == TargetPlatform.android)
//do sth for Android
else if(Theme.of(context).platform == TargetPlatform.iOS)
//do sth else for iOS
else if(Theme.of(context).platform == TargetPlatform.fuchsia)
//even do sth else for Fuchsia OS
这个自定义创建的类将帮助您检测平台:
import 'package:flutter/foundation.dart'
show defaultTargetPlatform, kIsWeb, TargetPlatform;
enum Os {
web,
android,
ios,
macOS,
linux,
windows,
fuchsia,
}
class Platform {
const Platform();
/// Platform is Web.
static bool get isWeb => os == Os.web;
/// Platform is Android.
static bool get isAndroid => os == Os.android;
/// Platform is IOS.
static bool get isIOS => os == Os.ios;
/// Platform is Fuchsia.
static bool get isFuchsia => os == Os.fuchsia;
/// Platform is Linux.
static bool get isLinux => os == Os.linux;
/// Platform is MacOS.
static bool get isMacOS => os == Os.macOS;
/// Platform is Windows.
static bool get isWindows => os == Os.windows;
/// Platform is Android or IOS.
static bool get isMobile => isAndroid || isIOS;
/// Platform is Android or IOS or Fuchsia.
static bool get isFullMobile => isMobile || isFuchsia;
/// Platform is Linux or Windows or MacOS.
static bool get isDesktop => isLinux || isWindows || isMacOS;
/// Getting the os name.
static Os get os {
if (kIsWeb) {
return Os.web;
}
switch (defaultTargetPlatform) {
case TargetPlatform.android:
return Os.android;
case TargetPlatform.iOS:
return Os.ios;
case TargetPlatform.macOS:
return Os.macOS;
case TargetPlatform.windows:
return Os.windows;
case TargetPlatform.fuchsia:
return Os.fuchsia;
case TargetPlatform.linux:
return Os.linux;
}
}
}
你可以这样做
defaultTargetPlatform == TargetPlatform.iOS
? kIOSTheme
: kDefaultTheme,
从导入'包:flutter/foundation.dart';
为更简单的方式为网络和应用程序。试试这个
import 'dart:io' show Platform;
import 'package:flutter/foundation.dart' show kIsWeb;
var platformName = '';
if (kIsWeb) {
platformName = "Web";
} else {
if (Platform.isAndroid) {
platformName = "Android";
} else if (Platform.isIOS) {
platformName = "IOS";
} else if (Platform.isFuchsia) {
platformName = "Fuchsia";
} else if (Platform.isLinux) {
platformName = "Linux";
} else if (Platform.isMacOS) {
platformName = "MacOS";
} else if (Platform.isWindows) {
platformName = "Windows";
}
}
print("platformName :- "+platformName.toString());
您可以将此扩展添加到项目中
import 'package:flutter/material.dart';
extension PlatformExtension on BuildContext {
bool get isMobile =>
Theme.of(this).platform == TargetPlatform.iOS ||
Theme.of(this).platform == TargetPlatform.android;
bool get isDesktop =>
Theme.of(this).platform == TargetPlatform.macOS ||
Theme.of(this).platform == TargetPlatform.windows ||
Theme.of(this).platform == TargetPlatform.linux;
}
extension TargetPlatformExtension on TargetPlatform {
bool get isMobile =>
this == TargetPlatform.iOS || this == TargetPlatform.android;
bool get isDesktop =>
this == TargetPlatform.linux ||
this == TargetPlatform.macOS ||
this == TargetPlatform.windows;
}
现在您可以使用。
内置context => context.isDesktop 目标平台=> defaulttarded平台
建议从上下文访问平台。
要检测您的应用程序是否在浏览器上运行,您可以轻松地使用基础库中的kIsWeb常量。
import 'package:flutter/foundation.dart';
log('$kIsWeb'); // will print true if the app is running on a browser
注意,如果你在桌面上运行web应用程序,isDesktop getter将返回true,对于移动平台也是如此。 为了避免这种情况。
import 'package:flutter/foundation.dart';
if (!kIsWeb && defaultTargetPlatform.isDesktop) {
// do stuff for desktop apps only
}
if (!kIsWeb && defaultTargetPlatform.isMobile) {
// do stuff for mobile apps only
}
您可以修改扩展以获得您喜欢的实现。
推荐文章
- 在Flutter中向有状态小部件传递数据
- 未处理异常:ServicesBinding.defaultBinaryMessenger在绑定初始化之前被访问
- 出现键盘时,Flutter小部件将调整大小。如何预防这种情况?
- 颤振-换行文本
- 如何在Dart中四舍五入到小数点后的给定精度程度?
- 添加一个启动屏幕颤振应用程序
- 在flutter中等同于wrap_content和match_parent ?
- 多行文本字段在扑动
- 如何在颤振文本下划线
- 在Dart中命名参数和位置参数之间有什么区别?
- 如何用Dart将字符串解析为数字?
- 如何在颤振的一些延迟后运行代码?
- 颤动删除appbar上的返回按钮
- 在构建过程中调用setState()或markNeedsBuild
- 我如何添加阴影的小部件颤振?