จะตรวจสอบแอปพลิเคชัน Flutter ได้อย่างไรในการแก้ปัญหา


95

ฉันมีคำถามสั้น ๆ ฉันกำลังมองหาวิธีรันโค้ดใน Flutter เมื่อแอพอยู่ในโหมด Debug เป็นไปได้ไหมใน Flutter ฉันไม่สามารถหาได้จากที่ใดในเอกสาร

อะไรทำนองนี้

If(app.inDebugMode) {
   print("Print only in debug mode");
}

จะตรวจสอบได้อย่างไรว่าแอพพลิเคชั่น Flutter กำลังทำงานในโหมด debug หรือ release?



1
ฉันพยายามยืนยัน (() {พิมพ์ ("โหมดดีบัก"); ส่งคืนจริง;}); แต่นั่นทำให้ฉันมีข้อผิดพลาดที่ไม่สามารถรวบรวมได้ "โปรไฟล์" ที่พวกเขาพูดถึงในโพสต์ในภายหลังไม่สมเหตุสมผลกับฉันมากนัก คุณช่วยอธิบายวิธีการใช้งานได้หรือไม่?
Kevin Walter

คำตอบ:


26

ในขณะนี้ใช้งานได้โดยใช้ค่าคงที่kReleaseModeหรือkDebugModeดีกว่า ดูคำตอบของRémiด้านล่างเพื่อดูคำอธิบายทั้งหมดซึ่งน่าจะเป็นคำถามที่ยอมรับได้


วิธีที่ง่ายที่สุดคือใช้assertเนื่องจากทำงานในโหมดดีบักเท่านั้น

นี่คือตัวอย่างจากซอร์สโค้ด Navigator ของ Flutter:

assert(() {
  if (navigator == null && !nullOk) {
    throw new FlutterError(
      'Navigator operation requested with a context that does not include a Navigator.\n'
      'The context used to push or pop routes from the Navigator must be that of a '
      'widget that is a descendant of a Navigator widget.'
    );
  }
  return true;
}());

โดยเฉพาะอย่างยิ่ง()ในตอนท้ายของการโทร - assert สามารถทำงานบนบูลีนเท่านั้นดังนั้นการส่งผ่านฟังก์ชันจึงไม่ได้ผล


1
"หมายเหตุโดยเฉพาะ" เป็นส่วนที่ IDE ของฉันสะดุด ขอบคุณมาก!
Kevin Walter

5
เมื่อคุณเขียน() { .... }คุณกำลังกำหนดฟังก์ชัน แต่ไม่ได้เรียกมัน การเพิ่ม()ฟังก์ชันการเรียกใช้งานจริง
rmtmckenzie

257

ในขณะที่ยืนยันว่าใช้งานได้จริงคุณไม่ควรใช้

ให้ใช้ค่าคงที่kReleaseModeจากpackage:flutter/foundation.dart


ความแตกต่างคือทั้งหมดเกี่ยวกับการเขย่าต้นไม้

การเขย่าต้นไม้ (หรือที่เรียกว่าคอมไพเลอร์ลบโค้ดที่ไม่ได้ใช้) ขึ้นอยู่กับตัวแปรที่เป็นค่าคงที่

ปัญหาคือด้วยการยืนยันว่าisInReleaseModeบูลีนของเราไม่ใช่ค่าคงที่ ดังนั้นเมื่อจัดส่งแอปของเราทั้ง dev และ release code จะรวมอยู่ด้วย

ในทางกลับกันkReleaseMode เป็นค่าคงที่ ดังนั้นคอมไพเลอร์จึงสามารถลบโค้ดที่ไม่ได้ใช้ออกได้อย่างถูกต้องและเราสามารถทำได้อย่างปลอดภัย:

if (kReleaseMode) {

} else {
  // Will be tree-shaked on release builds.
}

27
เพียงแค่บันทึกเล็ก ๆ น้อย ๆ เช่นกันเพื่อหลีกเลี่ยงมลพิษในชั้นเรียนของคุณด้วยการนำเข้าที่ไม่รู้จักดังต่อไปนี้import 'package:flutter/foundation.dart' as Foundation;คุณสามารถทำได้Foundation. kReleaseMode
Oliver Dixon

3
ขอบคุณที่อธิบายเรมี - ฉันเลือกสิ่งนี้แทนการยืนยัน - สิ่งที่ดี!
Fred

1
เป็นอย่างไรบ้างนี่น่าจะเป็นคำตอบที่ยอมรับได้!
Empty2k12

5
นอกจากนี้ยังมี kDebugMode
Alexander Skvortsov

1
ต้นไม้สั่นจะเกิดขึ้นกับวิดเจ็ตด้วยหรือไม่? ดังนั้นหากฉันสร้างวิดเจ็ต Visibility ที่มองเห็นได้: kDebugMode คอมไพลเลอร์นั้นจะถูกลบออกโดยคอมไพเลอร์สำหรับรีลีสบิลด์หรือไม่
WiteCastle

56

ตัวอย่างเล็ก ๆ น้อย ๆ นี้ควรทำในสิ่งที่คุณต้องการ

bool get isInDebugMode {
  bool inDebugMode = false;
  assert(inDebugMode = true);
  return inDebugMode;
}

หากไม่สามารถกำหนดค่า IDE ของคุณให้เปิดmain.dartโหมดดีบักที่แตกต่างกันซึ่งคุณสามารถตั้งค่าบูลีนได้


ฉันจัดให้เป็นแบบคงที่ในApplicationชั้นเรียนเพื่อที่ฉันจะได้เขียนในApplication.isInDebugModeที่ที่ฉันต้องการ
ToniTornado

สวยมากใช้สิ่งนี้ในแอพของฉัน
vrachlin

53

นี่คือวิธีง่ายๆสำหรับสิ่งนี้:

import 'package:flutter/foundation.dart';

จากนั้นคุณสามารถใช้kReleaseModeเช่น

if(kReleaseMode){ // is Release Mode ??
    print('release mode');
} else {
    print('debug mode');
}

20

ไม่ต้องจู้จี้จุกจิก แต่ชุดรองพื้นมีkDebugModeค่าคงที่ ดังนั้น:

import 'package:flutter/foundation.dart' as Foundation;

if(Foundation.kDebugMode) {
   print("App in debug mode");
}

19

kDebugMode

ตอนนี้คุณสามารถใช้อย่างต่อเนื่องkDebugMode

if (kDebugMode) {
  // Code here will only be included in debug mode.
  // As kDebugMode is a constant, the tree shaker
  // will remove the code entirely from compiled code.
} else {

}

นี้มีมากกว่า preferrable !kReleaseModeขณะที่มันยังตรวจสอบรายละเอียดสำหรับโหมดคือkDebugModeหมายความว่าไม่ได้อยู่ในการเปิดตัวโหมดและไม่ได้อยู่ในรายละเอียดโหมด

kReleaseMode

หากคุณต้องการตรวจสอบโหมดรีลีสไม่ใช่สำหรับโหมดโปรไฟล์คุณสามารถใช้kReleaseModeแทนได้ดังนี้

if (kReleaseMode) {
  // Code here will only be run in release mode.
  // As kReleaseMode is a constant, the tree shaker
  // will remove the code entirely from other builds.
} else {

}

kProfileMode

หากคุณต้องการตรวจสอบโหมดโปรไฟล์ไม่ใช่สำหรับโหมดรีลีสคุณสามารถใช้kProfileModeแทนได้ดังนี้

if (kProfileMode) {
  // Code here will only be run in release mode.
  // As kProfileMode is a constant, the tree shaker
  // will remove the code entirely from other builds.
} else {

}

2

นี่คือสองขั้นตอนในการค้นหาว่าแอปพลิเคชันทำงานในโหมดใด

  1. เพิ่มการนำเข้าต่อไปนี้สำหรับการรับ

    import 'package:flutter/foundation.dart' as Foundation;
    
  2. และkReleaseModeตรวจสอบว่าแอปพลิเคชันกำลังทำงานอยู่ในโหมดใด

    if(Foundation.kReleaseMode){ 
      print('app release mode');
    } else {
      print('App debug mode');
    }
    

1

ฉันเชื่อว่าวิธีล่าสุดในการดำเนินการนี้คือ:

const bool prod = const bool.fromEnvironment('dart.vm.product');

src


0

ดึงมาจากเอกสาร Dart :

การยืนยันได้ผลเมื่อใด ขึ้นอยู่กับเครื่องมือและกรอบงานที่คุณใช้:

  • Flutter เปิดใช้งานการยืนยันในโหมดดีบัก
  • เครื่องมือสำหรับการพัฒนาเท่านั้นเช่น dartdevc มักจะเปิดใช้การยืนยันตามค่าเริ่มต้น
  • เครื่องมือบางอย่างเช่น dart และ dart2js สนับสนุนการยืนยันผ่านแฟล็กบรรทัดคำสั่ง: --enable-asserts

ในรหัสการผลิตการยืนยันจะถูกละเว้นและอาร์กิวเมนต์ที่จะยืนยันจะไม่ได้รับการประเมิน

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