Як ви визначаєте хост-платформу за допомогою коду Dart?


140

Для інтерфейсу користувача, який має трохи відрізнятися на iOS та Android , тобто на різних платформах , повинен бути спосіб визначити, на якому додатку працює додаток, але я не зміг його знайти в документах. Що це?

Відповіді:


336
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

4
Це має бути прийнятою відповіддю, оскільки це простота і читабельність.
Ендрю

@NatoBoram ви повинні викликати Platform.isAndroid методом класу, прямий дзвінок у класі не працював
Джабір Ішак

67

Завдяки Коллін, остаточна відповідь:

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

3
Тільки ця відповідь актуальна з останніми рамками Flutter. Відповіді на решту не є помилковими, але за замовчуванням TargetPlatform, здається, вже не є частиною рамки
Стойчо Андрєєв

21

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


1
Чи можу я запитати, яка різниця між запропонованим і цим if (Platform.isIOS) {//my iOS widgets}
aziza

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

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.
І. Педан

1
Можливо, із імпортом, який ви додали вчора до пошти. : D
І. Педан

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');

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
Це правильна відповідь. Вам просто потрібно видалити будь-який дротик: імпорт HTML з вашого коду, оскільки це призведе до помилки.
Тайлер Пауелл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.