Ana bilgisayar platformunu Dart kodundan nasıl tespit edersiniz?


141

İOS ve Android'de biraz farklı olması gereken UI için , yani farklı platformlarda , uygulamanın hangisinde çalıştığını saptamanın bir yolu olmalı, ancak bunu belgelerde bulamadım. Bu ne?

Yanıtlar:


337
import 'dart:io' show Platform;

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

Tüm seçenekler şunları içerir:

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

Ayrıca kIsWeb, uygulamanın web üzerinde çalışacak şekilde derlenip derlenmediğini gösteren global bir sabit kullanarak web üzerinde çalışıp çalışmadığınızı da tespit edebilirsiniz :

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)Kullanılacak herhangi bir ön koşul var mı Platform?
NatoBoram

4
Cevabımı gerekli içe aktarmayı içerecek şekilde güncelledim.
Westy92

4
Bu, basitliği ve okunabilirliği için kabul edilen cevap olmalıdır.
Andrew Steinmetz

@NatoBoram, Platform.isAndroid'i bir sınıf yönteminde aramanız gerekiyor, sınıftaki doğrudan çağrı işe yaramadı
Jabir Ishaq

67

Collin sayesinde, son cevap:

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

3
Sadece bu cevap en son Flutter çerçevesi ile günceldir. Geri kalan cevaplar yanlış değil, ancak defaultTargetPlatform artık çerçevenin bir parçası değil gibi görünüyor
Stoycho Andreev

21

Çalışacak olmasına rağmen defaultTargetPlatform, kullanmanızı öneririm Theme.of(context).targetPlatform. Bu, iOS davranışının test edilmesini sağlar (çünkü defaultTargetPlatformher zaman TargetPlatform.androidtestlerde bulunur). Ayrıca, widget'ınızın atalarının bir Themewidget'a sararak hedef platformunu geçersiz kılmasına olanak tanır .


1
Önerilen if (Platform.isIOS) {//my iOS widgets}
şeyle

3
Platform.isIOSile aynı sorunlara sahip defaultTargetPlatform. Testlerde çalışmaz ve Themewidget tarafından üzerine yazılamaz .
Collin Jackson

Artık 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

Çoğu "Flutter" yanıtı aşağıdaki gibidir:

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

Yapabilirsin

defaultTargetPlatform == TargetPlatform.iOS
          ? kIOSTheme
          : kDefaultTheme,

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


Artık çalışmıyor. DefaultTargetPlatform'u alamadım.
I. Pedan

1
Gönderiye dün eklediğiniz içe aktarma ile olabilir. : D
I. Pedan

1

Basittir, sadece io kitaplığını içe aktarın

import'dart:io' show Platform;
void main(){
if(Platform.isIOS){
  return someThing();
}else if(Platform.isAndroid){
  return otherThing();
}else if(Platform.isMacOS){
  return anotherThing();
}

veya çok basit bir şekilde

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

1
Bu doğru cevap. Bir hataya neden olacağından kodunuzdan herhangi bir dart: HTML içe aktarımını kaldırmanız yeterlidir.
tyler powell

0

Universal Platform paketini kullanabilirsiniz:

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');
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.