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?

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

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;

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.


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

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

9

Możesz to zrobić

defaultTargetPlatform == TargetPlatform.iOS
          ? kIOSTheme
          : kDefaultTheme,

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


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

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

1
To jest poprawna odpowiedź. Musisz po prostu usunąć dowolną strzałkę: import HTML z kodu, ponieważ spowoduje to błąd.
tyler powell
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.