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