如何从Dart代码中检测主机平台?

对于在iOS安卓上略有不同的UI,即在不同平台< em > < / em >上,必须有一种方法来检测应用程序在哪个上运行,但我在文档中找不到它。是什么?

201177 次浏览

你可以这样做

defaultTargetPlatform == TargetPlatform.iOS
? kIOSTheme
: kDefaultTheme,

import 'package:flutter/foundation.dart';

虽然defaultTargetPlatform可以工作,但我建议使用Theme.of(context).targetPlatform。这样就可以测试iOS行为(因为在测试中defaultTargetPlatform总是TargetPlatform.android)。它还允许小部件的祖先通过将其包装在Theme小部件中来覆盖其目标平台。

感谢科林,最终答案是:

bool isIOS = Theme.of(context).platform == TargetPlatform.iOS;
import 'dart:io' show Platform;


if (Platform.isAndroid) {
// Android-specific code
} else if (Platform.isIOS) {
// iOS-specific code
}

所有选项包括:

Platform.isAndroid
Platform.isFuchsia
Platform.isIOS
Platform.isLinux
Platform.isMacOS
Platform.isWindows

你也可以使用kIsWeb来检测你是否在web上运行,这是一个全局常量,指示应用程序是否被编译为在web上运行:

import 'package:flutter/foundation.dart' show kIsWeb;


if (kIsWeb) {
// running on the web!
} else {
// NOT running on the web! You can check for additional platforms here.
}

最“扑”的答案如下:

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 'dart:io' show Platform;  //at the top


String os = Platform.operatingSystem; //in your code
print(os);

您可以使用通用平台包:

https://pub.dev/packages/universal_platform

import 'package:universal_platform/universal_platform.dart';


bool isIos = UniversalPlatform.isIOS;
bool isAndroid = UniversalPlatform.isAndroid;
bool isWeb = UniversalPlatform.isWeb;
print('iOS: $isIos');
print('Android: $isAndroid');
print('Web: $isWeb');

导入io库很简单

import'dart:io' show Platform;
void main(){
if(Platform.isIOS){
return someThing();
}else if(Platform.isAndroid){
return otherThing();
}else if(Platform.isMacOS){
return anotherThing();
}

或者用非常简单的方式

Platform.isIOS ? someThing() : anOther(),

为更简单的方式为网络和应用程序。试试这个

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());
if (Platform.isAndroid) {
// Android-specific code/UI Component
} else if (Platform.isIOS) {
// iOS-specific code/UI Component
}

不要忘记导入IO库。

import 'dart:io';

如果你也在同一个文件中使用import 'dart:html';,那么你必须指定平台定义,因为两个库都有“平台”的定义。

在这种情况下,使用如下所示的平台特定代码:

import 'dart:io' as IO;
import 'dart:html';


if (IO.Platform.isAndroid) {
// Android-specific code/UI Component
} else if (IO.Platform.isIOS) {
// iOS-specific code/UI Component
}

如果你正在寻找平台集成,我建议在Flutter网站上使用完整的示例: https://flutter.dev/docs/development/platform-integration/platform-channels < / p >

import 'dart:io' as io;


if(io.Platform.isAndroid){
doSomething();
}else {
doSomethingElse();
}

所以这里有一个小工具,我用来检测平台和操作系统的反应适当。

import'dart:io' show Platform;
import 'package:flutter/foundation.dart' show kIsWeb;


class Util {


os getPlatform() {
if (kIsWeb) {
return os.Web;
} else if (Platform.isIOS) {
return os.IOS;
} else if (Platform.isAndroid) {
return os.Android;
} else if (Platform.isFuchsia) {
return os.Fuchsia;
} else if (Platform.isLinux) {
return os.Linux;
} else if (Platform.isMacOS) {
return os.MacOS;
} else if (Platform.isWindows) {
return os.Windows;
}
return os.Unknown;
}


bool isWeb() {
return (getPlatform()==os.Web);
}


bool isMobile() {
os platform = getPlatform();
return (platform == os.Android || platform == os.IOS || platform== os.Fuchsia);
}


bool isComputer() {
os platform = getPlatform();
return (platform == os.Linux || platform == os.MacOS || platform== os.Windows);
}


}


enum os { Unknown, Web, Android, Fuchsia, IOS, Linux, MacOS, Windows }


如果你只是需要一个字符串来记录日志,你可以使用Platform.operatingSystem,它返回操作系统名称为小写字符串。

import 'dart:io';
import 'package:flutter/foundation.dart';


String _getPlatform() {
if (kIsWeb) return 'web';
return Platform.operatingSystem;
}

您可以将这个扩展文件(platform_ext.dart)添加到项目中并调用任何对象

import 'dart:io';
import 'package:flutter/foundation.dart' show kIsWeb;


extension Target on Object {
bool isAndroid() {
return Platform.isAndroid;
}
bool isIOS() {
return Platform.isIOS;
}
bool isLinux() {
return Platform.isLinux;
}
bool isWindows() {
return Platform.isWindows;
}
bool isMacOS() {
return Platform.isMacOS;
}
bool isWeb() {
return kIsWeb;
}
// ···
}

只需导入文件并调用它

   import 'platform_ext.dart';
....
@override
Widget build(BuildContext context) {
return isAndroid()? Text("Android"):Text("Not Android");
}

Dart主机平台检查。

导入'dart:io'作为io;

_checkingHostPlatform(){
if(IO.Platform.isAndroid){
//Execute code for android
}else if(IO.Platform.isIOS){
//Execute code for iOS
}else{
//Execute code for other platforms
}
}
import 'dart:io' show Platform;


if (Platform.isAndroid) {
// Android-specific code
} else if (Platform.isIOS) {
// iOS-specific code
}else if (Platform.isFuchsia) {
// Fuchsia-specific code
}else if (Platform.isLinux) {
// Linux-specific code
}else if (Platform.isMacOS) {
// MacOS-specific code
}else if (Platform.isWindows) {
// Windows-specific code
}else if (Platform.isWindows) {
// Windows-specific code
}

网络

import 'package:flutter/foundation.dart' show kIsWeb;


if (kIsWeb) {
// running on the web!
} else {
// NOT running on the web! You can check for additional platforms here.
}
**multiple platform you check and run your code according specific platform **


bool isIOS = Theme.of(context).platform == TargetPlatform.iOS;
bool isAndroid = Theme.of(context).platform == TargetPlatform.android;
bool islinux = Theme.of(context).platform == TargetPlatform.linux;
bool isfuchsia = Theme.of(context).platform == TargetPlatform.fuchsia;
bool isMacOS = Theme.of(context).platform == TargetPlatform.macOS;
bool iswindows = Theme.of(context).platform == TargetPlatform.windows;

要检测操作系统是否为iOS,你可以使用这一行:

bool isIOS = Theme.of(context).platform == TargetPlatform.iOS;

您可以将此扩展添加到项目中

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;
}


现在您可以使用。

  1. < p > BuildContext =比;context.isDesktop

  2. < p > TargetPlatform =比;defaultTargetPlatform.isDesktop

建议从上下文访问平台。

要检测您的应用程序是否在浏览器上运行,您可以轻松地使用基础库中的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
}

您可以修改扩展以获得您喜欢的实现。