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


141

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

Ответы:


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

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. Остальные ответы не ошибочны, но 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);

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.