Comment détectez-vous la plate-forme hôte à partir du code Dart?

140

Pour une interface utilisateur qui devrait légèrement différer sur iOS et Android , c'est-à-dire sur différentes plates - formes , il doit y avoir un moyen de détecter sur laquelle l'application s'exécute, mais je ne l'ai pas trouvée dans la documentation. Qu'Est-ce que c'est?

Gavin
la source

Réponses:

336
import 'dart:io' show Platform;

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

Toutes les options comprennent:

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

Vous pouvez également détecter si vous exécutez sur le Web en utilisant kIsWeb, une constante globale indiquant si l'application a été compilée pour s'exécuter sur le 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
la source
Undefined name 'Platform'.dart(undefined_identifier)Y a-t-il des conditions préalables à utiliser Platform?
NatoBoram
4
J'ai mis à jour ma réponse pour inclure l'importation nécessaire.
Westy92
4
Cela devrait être la réponse acceptée pour sa simplicité et sa lisibilité.
Andrew Steinmetz
@NatoBoram vous devez appeler Platform.isAndroid dans une méthode de classe, l'appel direct en classe n'a pas fonctionné
Jabir Ishaq
67

Merci à Collin, la réponse finale est:

bool isIOS = Theme.of(context).platform == TargetPlatform.iOS;
Gavin
la source
3
Seule cette réponse est à jour avec le dernier framework Flutter. Les autres réponses ne sont pas fausses mais defaultTargetPlatform ne semble plus faire partie du framework
Stoycho Andreev
21

Bien que defaultTargetPlatformcela fonctionnera, je suggérerais d'utiliser Theme.of(context).targetPlatform. Cela permet de tester le comportement iOS (car il defaultTargetPlatformest toujours TargetPlatform.androiden test). Il permet également aux ancêtres de votre widget de remplacer sa plate-forme cible en l'enveloppant dans un Themewidget.

Collin Jackson
la source
1
Puis-je demander quelle est la différence entre ce qui est proposé et celui-ci if (Platform.isIOS) {//my iOS widgets}
aziza
3
Platform.isIOSa les mêmes problèmes que defaultTargetPlatform. Cela ne fonctionne pas dans les tests et ne peut pas être écrasé par le Themewidget.
Collin Jackson
Vous pouvez maintenant remplacer defaultTargetPlatform dans unittest avec 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
la source
10

La plupart des réponses "Flutter" sont les suivantes:

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
Ougurcan Yildirim
la source
9

Tu peux faire

defaultTargetPlatform == TargetPlatform.iOS
          ? kIOSTheme
          : kDefaultTheme,

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

Rémi Rousselet
la source
Ça ne marche plus. Je n'ai pas réussi à obtenir defaultTargetPlatform.
I. Pedan
1
Peut-être avec l'importation que vous avez ajoutée hier à la publication. : D
I. Pedan
0

Vous pouvez utiliser le package 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');
J. Nuno Negrão Martins
la source
0

C'est simple, il suffit d'importer la bibliothèque 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();
}

ou de manière très simple

Platform.isIOS ? someThing() : anOther(),
osama buzdar
la source
1
C'est la bonne réponse. Il vous suffit de supprimer toute fléchette: importation HTML de votre code car cela provoquera une erreur.
tyler powell le