Como você detecta a plataforma host do código Dart?

140

Para IU que deve ser um pouco diferente no iOS e no Android , ou seja, em plataformas diferentes , deve haver uma maneira de detectar em qual aplicativo está sendo executado, mas não consegui encontrar nos documentos. O que é isso?

Gavin
fonte

Respostas:

336
import 'dart:io' show Platform;

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

Todas as opções incluem:

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

Você também pode detectar se está executando na web usando kIsWebuma constante global que indica se o aplicativo foi compilado para ser executado na 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.
}
Westy92
fonte
Undefined name 'Platform'.dart(undefined_identifier)Existe algum pré-requisito a ser usado Platform?
NatoBoram
4
Eu atualizei minha resposta para incluir a importação necessária.
Westy92
4
Essa deve ser a resposta aceita por sua simplicidade e legibilidade.
Andrew Steinmetz
@NatoBoram, você tem que chamar Platform.isAndroid em um método de classe, a chamada direta na classe não funcionou
Jabir Ishaq
67

Graças a Collin, a resposta final é:

bool isIOS = Theme.of(context).platform == TargetPlatform.iOS;
Gavin
fonte
3
Apenas esta resposta está atualizada com a estrutura mais recente do Flutter. As respostas restantes não estão erradas, mas defaultTargetPlatform parece não fazer mais parte da estrutura
Stoycho Andreev
21

Embora defaultTargetPlatformfuncione, eu sugiro usar Theme.of(context).targetPlatform. Isso permite testar o comportamento do iOS (porque defaultTargetPlatformestá sempre TargetPlatform.androidem testes). Ele também permite que os ancestrais de seu widget substituam sua plataforma de destino envolvendo-o em um Themewidget.

Collin Jackson
fonte
1
Posso perguntar qual é a diferença entre o que é proposto e este if (Platform.isIOS) {//my iOS widgets}
aziza
3
Platform.isIOStem os mesmos problemas que defaultTargetPlatform. Ele não funciona em testes e não pode ser substituído pelo Themewidget.
Collin Jackson
Agora você pode substituir defaultTargetPlatform em unittest por 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
fonte
10

A maioria das respostas "Flutter" é a seguinte:

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
fonte
9

Você pode fazer

defaultTargetPlatform == TargetPlatform.iOS
          ? kIOSTheme
          : kDefaultTheme,

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

Rémi Rousselet
fonte
Não funciona mais. Não consegui obter defaultTargetPlatform.
I. Pedan
1
Pode ser com a importação que você adicionou ontem ao post. : D
I. Pedan
0

Você pode usar o pacote da Plataforma Universal:

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
fonte
0

É simples, basta importar a biblioteca 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();
}

ou de forma muito simples

Platform.isIOS ? someThing() : anOther(),
Osama Buzdar
fonte
1
Essa é a resposta correta. Você simplesmente precisa remover qualquer importação de dart: HTML do seu código, pois isso causará um erro.
tyler powell