Bagaimana cara memeriksa aplikasi flutter berjalan di debug?


96

Saya punya pertanyaan singkat. Saya mencari cara untuk mengeksekusi kode di Flutter saat aplikasi dalam mode Debug. Apakah itu mungkin di Flutter? Sepertinya saya tidak dapat menemukannya di mana pun dalam dokumentasi.

Sesuatu seperti ini

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

Bagaimana cara memeriksa apakah aplikasi flutter berjalan dalam mode debug atau rilis?



1
Saya mencoba assert (() {print ("Debug mode"); return true;}); tetapi itu hanya memberi saya kesalahan yang tidak dapat dikompilasi. "Profil" yang mereka bicarakan nanti di pos tidak masuk akal bagi saya. Bisakah Anda menjelaskan cara menggunakannya?
Kevin Walter

Jawaban:


27

Saat ini berfungsi, menggunakan konstanta kReleaseModeatau kDebugModelebih disukai. Lihat jawaban Rémi di bawah untuk penjelasan lengkap, yang mungkin merupakan pertanyaan yang diterima.


Cara termudah adalah menggunakannya assertkarena ini hanya berjalan dalam mode debug.

Berikut adalah contoh dari kode sumber 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;
}());

Perhatikan khususnya ()di akhir panggilan - assert hanya dapat beroperasi pada boolean, jadi hanya meneruskan fungsi tidak akan berfungsi.


1
"Catatan khusus" adalah bagian yang membuat IDE saya tersandung. Terima kasih banyak!
Kevin Walter

5
Saat Anda menulis, () { .... }Anda sedang mendefinisikan fungsi, tetapi tidak memanggilnya. Menambahkan fungsi ()sebenarnya memanggil.
rmtmckenzie

257

Meskipun asserts secara teknis berfungsi, Anda sebaiknya tidak menggunakannya.

Sebagai gantinya, gunakan konstanta kReleaseModedaripackage:flutter/foundation.dart


Perbedaannya adalah tentang goyangan pohon

Goyangan pohon (alias kompiler yang menghapus kode yang tidak digunakan) bergantung pada variabel yang menjadi konstanta.

Masalahnya adalah, dengan menegaskan isInReleaseModeboolean kita bukanlah sebuah konstanta. Jadi, saat mengirimkan aplikasi kita, kode pengembang dan rilis disertakan.

Di sisi lain, kReleaseMode adalah konstanta. Oleh karena itu kompilator dapat dengan benar menghapus kode yang tidak digunakan, dan kita dapat dengan aman melakukan:

if (kReleaseMode) {

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

27
Sekadar catatan kecil juga, untuk menghindari polusi kelas Anda dengan impor yang tidak diketahui seperti berikut import 'package:flutter/foundation.dart' as Foundation;maka Anda dapat melakukannyaFoundation. kReleaseMode
Oliver Dixon

3
Terima kasih telah menjelaskan Remi - Saya memilih ini daripada menegaskan - hal-hal bagus!
Fred

1
Bagaimana sejauh ini, ini harus menjadi jawaban yang diterima!
Empty2k12

5
Juga ada kDebugMode
Alexander Skvortsov

1
Akankah gemetar pohon juga terjadi dengan widget? Jadi jika saya membuat widget Visibility dengan visible: kDebugMode apakah widget itu akan dihapus oleh kompiler untuk rilis build?
WiteCastle

56

cuplikan kecil ini harus melakukan apa yang Anda butuhkan

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

jika tidak, Anda dapat mengonfigurasi IDE untuk meluncurkan main.dartmode debug lain di mana Anda dapat menyetel boolean.


Saya meletakkannya sebagai statis di Applicationkelas sehingga saya bisa menulis di Application.isInDebugModemana saya membutuhkannya.
ToniTornado

Sangat elegan, menerapkan ini di aplikasi saya.
vrachlin

53

Berikut adalah solusi sederhana untuk ini:

import 'package:flutter/foundation.dart';

maka Anda dapat menggunakan kReleaseModesuka

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

20

Bukan untuk pilih-pilih, tetapi paket fondasi mencakup kDebugModekonstanta; Jadi:

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

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

20

kDebugMode

Sekarang Anda dapat menggunakan kDebugModekonstanta .

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 {

}

Ini lebih disukai !kReleaseModekarena ia juga memeriksa mode profil, kDebugModeartinya tidak dalam mode rilis dan tidak dalam mode profil .

kReleaseMode

Jika Anda hanya ingin memeriksa mode rilis dan bukan mode profil, Anda dapat menggunakan 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

Jika Anda hanya ingin memeriksa mode profil dan bukan mode rilis, Anda dapat menggunakan 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 {

}

3

Ini adalah dua langkah untuk mengetahui dalam mode mana aplikasi dijalankan

  1. Tambahkan impor berikut untuk mendapatkan

    import 'package:flutter/foundation.dart' as Foundation;
    
  2. Dan kReleaseModeperiksa mode aplikasi mana yang sedang berjalan

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

1

Saya yakin cara terbaru untuk melakukan ini adalah:

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

src


0

Diambil dari Dokumentasi Dart :

Kapan tepatnya pernyataan berfungsi? Itu tergantung pada alat dan kerangka kerja yang Anda gunakan:

  • Flutter mengaktifkan pernyataan dalam mode debug .
  • Alat khusus pengembangan seperti dartdevc biasanya mengaktifkan pernyataan secara default.
  • Beberapa alat, seperti dart dan dart2js, mendukung pernyataan melalui tanda baris perintah: --enable-asserts.

Dalam kode produksi , pernyataan diabaikan , dan argumen yang akan ditegaskan tidak dievaluasi.

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.