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.