Wie erkennt man die Host-Plattform anhand des Dart-Codes?

137

Für die Benutzeroberfläche, die sich unter iOS und Android geringfügig unterscheiden sollte , dh auf verschiedenen Plattformen , muss es eine Möglichkeit geben, zu erkennen, auf welcher die App ausgeführt wird, aber ich konnte sie in den Dokumenten nicht finden. Was ist es?

Gavin
quelle

Antworten:

331
import 'dart:io' show Platform;

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

Alle Optionen umfassen:

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

Sie können auch feststellen, ob Sie im Web ausgeführt werden kIsWeb, indem Sie eine globale Konstante verwenden, die angibt, ob die Anwendung für die Ausführung im Web kompiliert wurde:

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
quelle
Undefined name 'Platform'.dart(undefined_identifier)Gibt es irgendwelche Voraussetzungen, um zu verwenden Platform?
NatoBoram
4
Ich habe meine Antwort aktualisiert, um den erforderlichen Import einzuschließen.
Westy92
4
Dies sollte die akzeptierte Antwort sein, da es einfach und lesbar ist.
Andrew Steinmetz
@ NATOBoram Sie müssen Platform.isAndroid in einer Methode der Klasse aufrufen, direkter Aufruf in der Klasse hat nicht funktioniert
Jabir Ishaq
65

Dank Collin lautet die endgültige Antwort:

bool isIOS = Theme.of(context).platform == TargetPlatform.iOS;
Gavin
quelle
3
Nur diese Antwort ist mit dem neuesten Flutter-Framework auf dem neuesten Stand. Die restlichen Antworten sind nicht falsch, aber defaultTargetPlatform scheint nicht mehr Teil des Frameworks zu sein
Stoycho Andreev
21

Obwohl defaultTargetPlatformes funktionieren wird, würde ich vorschlagen, es zu verwenden Theme.of(context).targetPlatform. Dies ermöglicht das Testen des iOS-Verhaltens (da defaultTargetPlatformes sich immer TargetPlatform.androidum Tests handelt). Außerdem können Vorfahren Ihres Widgets die Zielplattform überschreiben, indem sie es in ein ThemeWidget einschließen.

Collin Jackson
quelle
1
Darf ich fragen, was der Unterschied zwischen dem, was vorgeschlagen wird, und dem ist if (Platform.isIOS) {//my iOS widgets}
Aziza
3
Platform.isIOShat die gleichen Probleme wie defaultTargetPlatform. Es funktioniert nicht in Tests und kann vom ThemeWidget nicht überschrieben werden .
Collin Jackson
Jetzt können Sie defaultTargetPlatform in unittest mit 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
quelle
10

Die meisten "Flattern" -Antworten lauten wie folgt:

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
quelle
8

Du kannst tun

defaultTargetPlatform == TargetPlatform.iOS
          ? kIOSTheme
          : kDefaultTheme,

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

Rémi Rousselet
quelle
Es funktioniert nicht mehr. Ich konnte die defaultTargetPlatform nicht abrufen.
I. Pedan
1
Möglicherweise mit dem Import, den Sie gestern zum Beitrag hinzugefügt haben. : D
I. Pedan
0

Sie können das Universal Platform-Paket verwenden:

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
quelle
0

Es ist einfach, einfach die io-Bibliothek zu importieren

import'dart:io' show Platform;
void main(){
if(Platform.isIOS){
  return someThing();
}else if(Platform.isAndroid){
  return otherThing();
}else if(Platform.isMacOS){
  return anotherThing();
}

oder auf sehr einfache Weise

Platform.isIOS ? someThing() : anOther(),
Osama Buzdar
quelle
Dies ist die richtige Antwort. Sie müssen lediglich den Dart: HTML-Import aus Ihrem Code entfernen, da dies zu einem Fehler führt.
Tyler Powell