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


139

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

Answers:


335
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全局常量检测是否在网络上运行,该常量指示应用程序是否已编译为可以在网络上运行:

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

Undefined name 'Platform'.dart(undefined_identifier)是否有任何根据条件使用Platform
NatoBoram

4
我已经更新了答案,以包括所需的导入。
Westy92 '19

4
由于其简单性和可读性,这应该是公认的答案。
安德鲁·斯坦梅兹

@NatoBoram,您必须在类的方法中调用Platform.isAndroid,在类中的直接调用无效
Jabir Ishaq

67

感谢Collin,最终的答案是:

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

3
只有最新的Flutter框架才提供最新的答案。其余答案没有错,但defaultTargetPlatform似乎不再是框架的一部分
Stoycho Andreev

21

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


1
我想问一下提议的内容与这个有什么区别 if (Platform.isIOS) {//my iOS widgets}
aziza

3
Platform.isIOS有与相同的问题defaultTargetPlatform。它在测试中不起作用,并且不能被Theme小部件覆盖。
科林·杰克逊

现在,您可以在单元测试debugDefaultTargetPlatformOverride覆盖defaultTargetPlatform api.flutter.dev/flutter/foundation/...
宇文燕

20
import 'dart:io' show Platform;  //at the top

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

10

多数“ Flutter”答案如下:

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

9

你可以做

defaultTargetPlatform == TargetPlatform.iOS
          ? kIOSTheme
          : kDefaultTheme,

import 'package:flutter/foundation.dart';


它不再起作用了。我无法获取defaultTargetPlatform。
I. Pedan '19

1
可能与您昨天添加到帖子中的导入有关。:D
I. Pedan


0

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

1
这是正确的答案。您只需要从代码中删除所有dart:HTML导入,因为它将导致错误。
泰勒·鲍威尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.