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?

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

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;

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.


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

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

9

Você pode fazer

defaultTargetPlatform == TargetPlatform.iOS
          ? kIOSTheme
          : kDefaultTheme,

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


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

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.