คุณตรวจจับแพลตฟอร์มโฮสต์จากรหัส Dart ได้อย่างไร?


141

สำหรับ UI ที่ควรแตกต่างกันเล็กน้อยในiOSและAndroidคือบนแพลตฟอร์มที่แตกต่างกันจะต้องมีวิธีตรวจสอบว่าแอปใดทำงานอยู่ แต่ฉันไม่พบในเอกสาร มันคืออะไร?

คำตอบ:


337
import 'dart:io' show Platform;

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

ตัวเลือกทั้งหมดประกอบด้วย:

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

นอกจากนี้คุณยังสามารถตรวจจับได้ว่าคุณกำลังทำงานบนเว็บโดยใช้kIsWebค่าคงที่ทั่วโลกที่ระบุว่าแอปพลิเคชันถูกคอมไพล์เพื่อทำงานบนเว็บหรือไม่:

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)มีข้อกำหนดต่อการใช้งานPlatformหรือไม่?
NatoBoram

4
ฉันได้อัปเดตคำตอบเพื่อรวมการนำเข้าที่จำเป็น
Westy92

4
นี่ควรเป็นคำตอบที่ได้รับการยอมรับสำหรับความเรียบง่ายและอ่านง่าย
Andrew Steinmetz

@NatoBoram คุณต้องเรียก Platform.isAndroid ในวิธีการเรียนการโทรโดยตรงในชั้นเรียนไม่ได้ผล
Jabir Ishaq

67

ขอบคุณ Collin คำตอบสุดท้ายคือ:

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

3
คำตอบนี้เท่านั้นที่เป็นข้อมูลล่าสุดของ Flutter framework ล่าสุด คำตอบที่เหลือไม่ผิด แต่ defaultTargetPlatform ดูเหมือนจะไม่ได้เป็นส่วนหนึ่งของกรอบงานอีกต่อไป
Stoycho Andreev

21

แม้ว่าจะทำงานผมจะแนะนำให้ใช้defaultTargetPlatform Theme.of(context).targetPlatformสิ่งนี้เปิดใช้งานการทดสอบพฤติกรรมของ iOS (เนื่องจากdefaultTargetPlatformอยู่TargetPlatform.androidในการทดสอบเสมอ) นอกจากนี้ยังอนุญาตให้บรรพบุรุษของวิดเจ็ตของคุณสามารถแทนที่แพลตฟอร์มเป้าหมายได้โดยการรวมไว้ในThemeวิดเจ็ต


1
ฉันขอถามอะไรคือความแตกต่างระหว่างสิ่งที่เสนอกับสิ่งนี้ if (Platform.isIOS) {//my iOS widgets}
aziza

3
Platform.isIOSมีปัญหาเช่นเดียวกับdefaultTargetPlatform. ไม่สามารถใช้งานได้ในการทดสอบและThemeวิดเจ็ตไม่สามารถเขียนทับได้
Collin Jackson

ตอนนี้คุณสามารถแทนที่ defaultTargetPlatform ใน unittest ด้วย debugDefaultTargetPlatformOverride api.flutter.dev/flutter/foundation/…
Yuwen Yan


10

คำตอบ "Flutter" ส่วนใหญ่มีดังนี้:

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

คุณทำได้

defaultTargetPlatform == TargetPlatform.iOS
          ? kIOSTheme
          : kDefaultTheme,

จาก import 'package:flutter/foundation.dart';


มันไม่ทำงานอีกต่อไป ฉันไม่สามารถรับ defaultTargetPlatform
I Pedan

1
อาจเป็นด้วยการนำเข้าที่คุณเพิ่มเมื่อวานนี้ในโพสต์ : D
I Pedan

1

ทำได้ง่ายเพียงแค่นำเข้าไลบรารี 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();
}

หรือวิธีง่ายๆ

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

1
นี่คือคำตอบที่ถูกต้อง คุณต้องลบโผใด ๆ : การนำเข้า HTML จากโค้ดของคุณเนื่องจากจะทำให้เกิดข้อผิดพลาด
ไทเลอร์พาวเวล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.