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?

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

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;

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.


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

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

8

Du kannst tun

defaultTargetPlatform == TargetPlatform.iOS
          ? kIOSTheme
          : kDefaultTheme,

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


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

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(),

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.