Jak rozpoznajesz platformę hosta na podstawie kodu Dart?

140

W przypadku interfejsu użytkownika, który powinien się nieco różnić w systemach iOS i Android , tj. Na różnych platformach , musi istnieć sposób na wykrycie, na którym działa aplikacja, ale nie mogłem go znaleźć w dokumentacji. Co to jest?

Gavin
źródło

Odpowiedzi:

336
import 'dart:io' show Platform;

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

Wszystkie opcje obejmują:

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

Możesz także wykryć, czy pracujesz w sieci, używając kIsWebstałej globalnej wskazującej, czy aplikacja została skompilowana do działania w sieci:

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
źródło
Undefined name 'Platform'.dart(undefined_identifier)Czy są jakieś wymagania do użycia Platform?
NatoBoram
4
Zaktualizowałem odpowiedź, aby uwzględnić potrzebny import.
Westy92
4
To powinna być akceptowana odpowiedź ze względu na prostotę i czytelność.
Andrew Steinmetz,
@NatoBoram musisz zadzwonić do Platform.isAndroid w metodzie klasy, bezpośrednie połączenie w klasie nie zadziałało
Jabir Ishaq
67

Dzięki Collinowi ostateczna odpowiedź brzmi:

bool isIOS = Theme.of(context).platform == TargetPlatform.iOS;
Gavin
źródło
3
Tylko ta odpowiedź jest aktualna z najnowszym frameworkiem Flutter. Pozostałe odpowiedzi nie są błędne, ale defaultTargetPlatform wydaje się nie być już częścią frameworka
Stoycho Andreev
21

Chociaż defaultTargetPlatformzadziała, sugerowałbym użycie Theme.of(context).targetPlatform. Umożliwia to testowanie zachowania iOS (ponieważ defaultTargetPlatformjest zawsze TargetPlatform.androidw testach). Umożliwia także przodkom widżetu zastąpienie platformy docelowej poprzez umieszczenie go w Themewidżecie.

Collin Jackson
źródło
1
Czy mogę zapytać, jaka jest różnica między tym, co jest proponowane, a tym if (Platform.isIOS) {//my iOS widgets}
aziza
3
Platform.isIOSma takie same problemy jak defaultTargetPlatform. Nie działa w testach i nie może zostać nadpisany przez Themewidżet.
Collin Jackson
Teraz możesz zastąpić defaultTargetPlatform w unittest za pomocą 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
źródło
10

Większość odpowiedzi „Flutter” jest następująca:

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
źródło
9

Możesz to zrobić

defaultTargetPlatform == TargetPlatform.iOS
          ? kIOSTheme
          : kDefaultTheme,

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

Rémi Rousselet
źródło
To już nie działa. Nie udało mi się uzyskać defaultTargetPlatform.
I. Pedan
1
Może być z importem, który dodałeś wczoraj do postu. : D
I. Pedan
0

Możesz skorzystać z pakietu 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
źródło
0

Wystarczy zaimportować bibliotekę 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();
}

lub w bardzo prosty sposób

Platform.isIOS ? someThing() : anOther(),
osama buzdar
źródło
1
To jest poprawna odpowiedź. Musisz po prostu usunąć dowolną strzałkę: import HTML z kodu, ponieważ spowoduje to błąd.
tyler powell