¿Cómo detecta la plataforma de host del código Dart?

140

Para la interfaz de usuario que debería diferir ligeramente en iOS y Android , es decir, en diferentes plataformas , debe haber una forma de detectar en cuál se está ejecutando la aplicación, pero no pude encontrarla en los documentos. ¿Qué es?

Gavin
fuente

Respuestas:

336
import 'dart:io' show Platform;

if (Platform.isAndroid) {
  // Android-specific code
} else if (Platform.isIOS) {
  // iOS-specific code
}

Todas las opciones incluyen:

Platform.isAndroid
Platform.isFuchsia
Platform.isIOS
Platform.isLinux
Platform.isMacOS
Platform.isWindows

También puede detectar si está ejecutando en la web usando kIsWebuna constante global que indica si la aplicación fue compilada para ejecutarse en la web:

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
fuente
Undefined name 'Platform'.dart(undefined_identifier)¿Hay algún requisito previo para usar Platform?
NatoBoram
4
He actualizado mi respuesta para incluir la importación necesaria.
Westy92
4
Esta debería ser la respuesta aceptada por su simplicidad y legibilidad.
Andrew Steinmetz
@NatoBoram tienes que llamar a Platform.isAndroid en un método de clase, la llamada directa en clase no funcionó
Jabir Ishaq
67

Gracias a Collin, la respuesta final es:

bool isIOS = Theme.of(context).platform == TargetPlatform.iOS;
Gavin
fuente
3
Solo esta respuesta está actualizada con el último marco de Flutter. El resto de las respuestas no son incorrectas, pero defaultTargetPlatform parece no ser más parte del marco
Stoycho Andreev
21

Aunque defaultTargetPlatformfuncionará, sugeriría usar Theme.of(context).targetPlatform. Esto permite probar el comportamiento de iOS (porque defaultTargetPlatformsiempre está TargetPlatform.androiden pruebas). También permite a los antepasados ​​de su widget anular su plataforma de destino envolviéndolo en un Themewidget.

Collin Jackson
fuente
1
¿Puedo preguntar cuál es la diferencia entre lo que se propone y esto if (Platform.isIOS) {//my iOS widgets}
Aziza
3
Platform.isIOStiene los mismos problemas que defaultTargetPlatform. No funciona en las pruebas y el Themewidget no puede sobrescribirlo .
Collin Jackson
Ahora puede anular defaultTargetPlatform en unittest con debugDefaultTargetPlatformOverride api.flutter.dev/flutter/foundation/…
Yuwen Yan
20
import 'dart:io' show Platform;  //at the top

String os = Platform.operatingSystem; //in your code
print(os);
C-Spydo
fuente
10

La mayoría de las respuestas de "Flutter" son las siguientes:

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
Ugurcan Yildirim
fuente
9

Tu puedes hacer

defaultTargetPlatform == TargetPlatform.iOS
          ? kIOSTheme
          : kDefaultTheme,

de import 'package:flutter/foundation.dart';

Rémi Rousselet
fuente
Ya no funciona. No pude obtener defaultTargetPlatform.
I. Pedan
1
Puede ser con la importación que agregaste ayer a la publicación. : D
I. Pedan
0

Puede utilizar el paquete de plataforma universal:

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');
J. Nuno Negrão Martins
fuente
0

Es simple, solo importa la biblioteca 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();
}

o de forma muy sencilla

Platform.isIOS ? someThing() : anOther(),
Osama Buzdar
fuente
1
Esta es la respuesta correcta. Simplemente necesita eliminar cualquier importación de dart: HTML de su código, ya que provocará un error.
Tyler Powell