Как вы определяете хост-платформу из кода Dart?

141

Для пользовательского интерфейса, который должен немного отличаться на iOS и Android , то есть на разных платформах , должен быть способ определить, на каком из них работает приложение, но я не смог найти его в документации. Что это?

Gavin
источник

Ответы:

337
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.
}
Westy92
источник
Undefined name 'Platform'.dart(undefined_identifier)Есть ли какие-то необходимые реквизиты Platform?
NatoBoram
4
Я обновил свой ответ, включив в него необходимый импорт.
Westy92
4
Это должен быть принятый ответ из-за его простоты и удобочитаемости.
Эндрю Штайнметц
@NatoBoram, вы должны вызвать Platform.isAndroid в методе класса, прямой вызов в классе не сработал
Джабир Исхак
67

Благодаря Коллину окончательный ответ таков:

bool isIOS = Theme.of(context).platform == TargetPlatform.iOS;
Gavin
источник
3
Только этот ответ актуален для последней версии фреймворка Flutter. Остальные ответы не ошибочны, но defaultTargetPlatform, похоже, больше не является частью структуры
Стойчо Андреев
21

Хотя defaultTargetPlatformбудет работать, я бы предложил использовать Theme.of(context).targetPlatform. Это позволяет тестировать поведение iOS (потому что defaultTargetPlatformвсегда находится TargetPlatform.androidв тестах). Он также позволяет предкам вашего виджета переопределить его целевую платформу, заключив ее в Themeвиджет.

Коллин Джексон
источник
1
Могу я спросить, в чем разница между тем, что предлагается, и этим if (Platform.isIOS) {//my iOS widgets}
азиза
3
Platform.isIOSимеет те же проблемы, что и defaultTargetPlatform. Он не работает в тестах и ​​не может быть перезаписан Themeвиджетом.
Коллин Джексон
Теперь вы можете переопределить defaultTargetPlatform в unittest с помощью debugDefaultTargetPlatformOverride api.flutter.dev/flutter/foundation/…
Ян
20
import 'dart:io' show Platform;  //at the top

String os = Platform.operatingSystem; //in your code
print(os);
С-Spydo
источник
10

Наиболее "флаттерный" ответ выглядит следующим образом:

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.
1
Может быть, с импортом, который вы вчера добавили в пост. : D
И. Педан
1

Просто импортируйте библиотеку 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 из вашего кода, так как это вызовет ошибку.
Тайлер Пауэлл
0

Вы можете использовать пакет Universal Platform:

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');
Ж. Нуно Неграу Мартинс
источник