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

如何从Dart代码中检测主机平台?,dart,flutter,Dart,Flutter,对于在iOS和Android上应该略有不同的UI,即在不同平台上,必须有一种方法来检测应用程序运行在哪个平台上,但我在文档中找不到它。这是什么?你可以做 defaultTargetPlatform == TargetPlatform.iOS ? kIOSTheme : kDefaultTheme, 从import'包:flatter/foundation.dart'虽然可以,但我建议使用主题.of(context.targetPlatform。这允许测试

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

你可以做

defaultTargetPlatform == TargetPlatform.iOS
          ? kIOSTheme
          : kDefaultTheme,

import'包:flatter/foundation.dart'

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

多亏了Collin,最终的答案是:

bool isIOS = Theme.of(context).platform == TargetPlatform.iOS;
导入“dart:io”展示平台;
if(Platform.isAndroid){
//Android特定代码
}else if(Platform.isIOS){
//iOS特定代码
}
所有选项包括:

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

  • 平台
    文档:
  • kIsWeb
    文档:
大多数“颤振”回答如下:

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
导入“dart:io”展示平台//在顶端
字符串os=Platform.operatingSystem//在代码中
打印(os);

您可以使用通用平台软件包:


只需导入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(),

有关web和应用程序两者的更简单方式,请尝试此方法

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());
别忘了导入IO库

import 'dart:io';
如果您使用的是
导入'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
}
如果您正在正确地研究平台集成,我建议您在颤振站点上使用完整的示例:

如果(Platform.isIOS){//my iOS widgets}
Platform.isIOS
defaultTargetPlatform
有相同的问题,那么我可以问一下提议的内容与此
有什么区别吗。它在测试中不起作用,并且不能被
主题
小部件覆盖。现在,您可以使用debugDefaultTargetPlatformOverride在unittest中覆盖defaultTargetPlatform。仅此答案是最新的颤振框架的最新答案。其余答案没有错,但defaultTargetPlatform似乎不再是框架的一部分此解决方案允许您在测试期间更改平台,这是我无法使用
platform.isIOS
未定义名称“platform”.dart(未定义的\u标识符)
是否有使用平台的每个必备条件?我已更新了答案,以包含所需的导入。@Natobram您必须调用Platform.isAndroid在类的方法中,直接在类中调用不起作用请注意,这对Flatter web不起作用。由于依赖于dart而引发异常:io@Srikanth如果您在检查其他平台之前先检查
kIsWeb
,就像我的答案所示,它会工作得很好。我刚在Dartpad网站上验证过,它已经不起作用了。我无法获取defaultTargetPlatform。可能与您昨天添加到帖子中的导入有关:这是正确的答案。您只需从代码中删除任何dart:HTML导入,因为这将导致错误。我建议您这样做。。。因为只有在我注意到不同浏览器上的Platform.isIOS的奇怪行为之后,我才觉得这是一个可以使用的包!顺便说一句,它确实提供了所有7个平台。Iversal_平台只在引擎盖下使用platform.isWindows、platform.isAndroid等。请注意,这不适用于颤振web。由于依赖于dart:io而引发异常
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
}
import 'dart:io';
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
}
import 'dart:io' as io;

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