Come rilevi la piattaforma host dal codice Dart?


140

Per l'interfaccia utente che dovrebbe differire leggermente su iOS e Android , ovvero su piattaforme diverse , deve esserci un modo per rilevare su quale è in esecuzione l'app, ma non sono riuscito a trovarlo nella documentazione. Che cos'è?

Risposte:


336
import 'dart:io' show Platform;

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

Tutte le opzioni includono:

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

Puoi anche rilevare se stai eseguendo sul Web utilizzando kIsWeb, una costante globale che indica se l'applicazione è stata compilata per essere eseguita sul Web:

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)Ci sono requisiti da utilizzare Platform?
NatoBoram

4
Ho aggiornato la mia risposta per includere l'importazione necessaria.
Westy92

4
Questa dovrebbe essere la risposta accettata per la sua semplicità e leggibilità.
Andrew Steinmetz

@NatoBoram devi chiamare Platform.isAndroid in un metodo di classe, la chiamata diretta in classe non ha funzionato
Jabir Ishaq,

67

Grazie a Collin, la risposta finale è:

bool isIOS = Theme.of(context).platform == TargetPlatform.iOS;

3
Solo questa risposta è aggiornata con l'ultimo framework Flutter. Le altre risposte non sono sbagliate ma defaultTargetPlatform sembra non essere più parte del framework
Stoycho Andreev

21

Sebbene defaultTargetPlatformfunzionerà, suggerirei di utilizzare Theme.of(context).targetPlatform. Ciò consente di testare il comportamento di iOS (perché defaultTargetPlatformè sempre TargetPlatform.androidnei test). Consente inoltre agli antenati del widget di sovrascrivere la sua piattaforma di destinazione avvolgendolo in un Themewidget.


1
Posso chiedere qual è la differenza tra ciò che viene proposto e questo if (Platform.isIOS) {//my iOS widgets}
aziza

3
Platform.isIOSha gli stessi problemi di defaultTargetPlatform. Non funziona nei test e non può essere sovrascritto dal Themewidget.
Collin Jackson,

Ora puoi sovrascrivere defaultTargetPlatform in unittest con 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

La maggior parte delle risposte "Flutter" è la seguente:

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

Tu puoi fare

defaultTargetPlatform == TargetPlatform.iOS
          ? kIOSTheme
          : kDefaultTheme,

a partire dal import 'package:flutter/foundation.dart';


Non funziona più. Non sono riuscito a ottenere defaultTargetPlatform.
I. Pedan

1
Potrebbe essere con l'importazione che hai aggiunto ieri al post. : D
I. Pedan

0

Puoi utilizzare il pacchetto 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

È semplice importare la libreria 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();
}

o in modo molto semplice

Platform.isIOS ? someThing() : anOther(),

1
Questa è la risposta corretta. Devi semplicemente rimuovere qualsiasi freccetta: importazione HTML dal tuo codice in quanto causerà un errore.
tyler powell il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.