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?

Gavin
sumber

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.
}
Westy92
sumber
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;
Gavin
sumber
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.

Collin Jackson
sumber
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);
C-Spydo
sumber
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
Ugurcan Yildirim
sumber
9

Anda dapat melakukan

defaultTargetPlatform == TargetPlatform.iOS
          ? kIOSTheme
          : kDefaultTheme,

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

Rémi Rousselet
sumber
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');
J. Nuno Negrão Martins
sumber
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(),
osama buzdar
sumber
1
Ini jawaban yang benar. Anda hanya perlu menghapus panah apa pun: impor HTML dari kode Anda karena akan menyebabkan kesalahan.
tyler powell