Bagaimana Anda mendeteksi platform host dari kode Dart?


140

Untuk UI yang seharusnya sedikit berbeda di iOS dan Android , yaitu pada platform yang berbeda , harus ada cara untuk mendeteksi aplikasi mana yang sedang berjalan, tetapi saya tidak dapat menemukannya di dokumen. Apa itu?

Jawaban:


336
import 'dart:io' show Platform;

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

Semua opsi termasuk:

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

Anda juga dapat mendeteksi jika Anda menjalankan di web menggunakan kIsWeb, konstanta global yang menunjukkan apakah aplikasi telah dikompilasi untuk dijalankan di 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)Apakah ada persyaratan untuk digunakan Platform?
NatoBoram

4
Saya telah memperbarui jawaban saya untuk menyertakan impor yang diperlukan.
Westy92

4
Ini harus menjadi jawaban yang diterima karena kesederhanaan dan keterbacaannya.
Andrew Steinmetz

@NatoBoram Anda harus memanggil Platform.isAndroid dalam metode kelas, panggilan langsung di kelas tidak berfungsi
Jabir Ishaq

67

Berkat Collin, jawaban akhirnya adalah:

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

3
Hanya jawaban ini yang mutakhir dengan kerangka Flutter terbaru. Jawaban lainnya tidak salah tetapi defaultTargetPlatform sepertinya bukan lagi bagian dari kerangka kerja
Stoycho Andreev

21

Meskipun defaultTargetPlatformakan berhasil, saya sarankan menggunakan Theme.of(context).targetPlatform. Ini memungkinkan pengujian perilaku iOS (karena defaultTargetPlatformselalu TargetPlatform.androiddalam pengujian). Ini juga memungkinkan leluhur widget Anda untuk mengganti platform targetnya dengan menggabungkannya dalam sebuah Themewidget.


1
Bolehkah saya bertanya apa perbedaan antara apa yang diusulkan dan ini if (Platform.isIOS) {//my iOS widgets}
aziza

3
Platform.isIOSmemiliki masalah yang sama seperti defaultTargetPlatform. Ini tidak berfungsi dalam pengujian dan tidak dapat ditimpa oleh Themewidget.
Collin Jackson

Sekarang Anda dapat mengganti defaultTargetPlatform secara unittest dengan 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

Kebanyakan jawaban "Flutter" adalah sebagai berikut:

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

Anda dapat melakukan

defaultTargetPlatform == TargetPlatform.iOS
          ? kIOSTheme
          : kDefaultTheme,

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


Itu tidak berfungsi lagi. Saya gagal mendapatkan defaultTargetPlatform.
I. Pedan

1
Mungkin dengan impor yang Anda tambahkan kemarin ke postingan. : D
I. Pedan

0

Anda dapat menggunakan paket Platform 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

Sederhana, cukup impor pustaka 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();
}

atau dengan cara yang sangat sederhana

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

1
Ini jawaban yang benar. Anda hanya perlu menghapus panah apa pun: impor HTML dari kode Anda karena akan menyebabkan kesalahan.
tyler powell
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.