Flutter uygulamasının hata ayıklamada çalışıp çalışmadığını nasıl kontrol edebilirim?


95

Kısa bir sorum var. Uygulama Hata Ayıklama modundayken Flutter'da kod yürütmenin bir yolunu arıyorum. Flutter'da bu mümkün mü? Belgelerin hiçbir yerinde bulamıyorum.

Bunun gibi bir şey

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

Flutter uygulamasının hata ayıklama veya bırakma modunda çalışıp çalışmadığını nasıl kontrol edebilirim?



1
Assert (() {print ("Hata ayıklama modu"); dönüş true;}); ama bu bana derlenemeyen bir hata veriyor. Yazının ilerleyen bölümlerinde bahsettikleri "Profil" bana pek mantıklı gelmiyor. Nasıl kullanılacağını açıklar mısınız lütfen?
Kevin Walter

Yanıtlar:


26

Bu işe yararken, sabitleri kullanılarak kReleaseModeveya kDebugModetercih edilir. Bkz Remiın cevabı muhtemelen kabul soru olmalıdır tam bir açıklama, aşağıda.


En kolay yol, assertyalnızca hata ayıklama modunda çalıştığı için kullanmaktır .

Flutter'ın Navigator kaynak kodundan bir örnek:

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;
}());

Özellikle ()çağrının sonundaki - assert'in yalnızca bir boolean üzerinde çalışabileceğine dikkat edin, bu nedenle sadece bir işlevi iletmek işe yaramaz.


1
Özellikle "Not" IDE'min takılıp kaldığı kısımdı. Çok teşekkür ederim!
Kevin Walter

5
Yazdığın zaman () { .... }fonksiyonu tanımlıyorsun ama onu çağırmıyorsun. ()Aslında eklemek işlevi çağırır.
rmtmckenzie

257

İddialar teknik olarak işe yarasa da bunları kullanmamalısınız.

Bunun yerine, sabit kullanın kReleaseModedanpackage:flutter/foundation.dart


Aradaki fark tamamen ağaç sallamakla ilgili

Ağaç sallama (başka bir deyişle, kullanılmayan kodu kaldıran derleyici) değişkenlerin sabit olmasına bağlıdır.

Sorun, isInReleaseModemantıksal değerimizin sabit olmadığıdır . Dolayısıyla, uygulamamızı gönderirken hem geliştirme hem de sürüm kodu dahildir.

Öte yandan, kReleaseMode bir sabit. Bu nedenle, derleyici kullanılmayan kodu doğru bir şekilde kaldırabilir ve güvenli bir şekilde şunları yapabiliriz:

if (kReleaseMode) {

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

27
Sadece küçük bir yan not, bilinmeyenlerle sınıfınızın kirlenmesini önlemek için aşağıdaki gibi ithal edin import 'package:flutter/foundation.dart' as Foundation;o zaman yapabilirsinizFoundation. kReleaseMode
Oliver Dixon,

3
Remi'yi açıkladığınız için teşekkürler - bunu iddia etmek yerine seçtim - iyi şeyler!
Fred

1
Bu nasıl bu kadar aşağıda, kabul edilen cevap bu olmalı!
Empty2k12

5
Ayrıca var kDebugMode
Alexander Skvortsov

1
Ağaç titremesi aletlerle de olacak mı? Öyleyse, görünür: kDebugMode ile bir Görünürlük widget'ı yaptıysam, bu pencere aracı sürüm yapıları için derleyici tarafından kaldırılacak mı?
WiteCastle

56

bu küçük parçacıklar ihtiyacınız olanı yapmalı

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

değilse, IDE'nizi main.dartbir boole ayarlayabileceğiniz farklı bir hata ayıklama modunda başlatacak şekilde yapılandırabilirsiniz .


Bunu bir Applicationsınıfa statik olarak koyuyorum, böylece Application.isInDebugModeihtiyacım olan yere yazabilirim .
ToniTornado

Çok zarif, bunu benim uygulamamda uyguladım.
vrachlin

53

İşte bunun için basit bir çözüm:

import 'package:flutter/foundation.dart';

o zaman kReleaseModebeğenebilirsin

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

20

Seçici olmamakla birlikte, temel paket bir kDebugModesabit içerir ; Yani :

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

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

19

kDebugMode

Artık kDebugModesabiti kullanabilirsiniz .

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 {

}

Bu preferrable bitti !kReleaseModeo da profil modu için denetler, yani olarak kDebugModeanlamı değil de serbest bırakma modunda ve değil de profil modu .

kReleaseMode

Profil modunu değil, yalnızca yayın modunu kontrol etmek istiyorsanız, kReleaseModebunun yerine şunu kullanabilirsiniz :

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

Serbest bırakma modunu değil, sadece profil modunu kontrol etmek istiyorsanız, kProfileModebunun yerine kullanabilirsiniz :

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

Bunlar, uygulamanın hangi modda çalıştığını bulmanın iki adımıdır

  1. Almak için aşağıdaki içe aktarmaları ekleyin

    import 'package:flutter/foundation.dart' as Foundation;
    
  2. Ve kReleaseModeuygulamanın hangi modda çalıştığını kontrol edin

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

1

Bunu yapmanın son yolunun şu olduğuna inanıyorum:

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

src


0

Dart Belgelerinden Alıntıdır :

İddialar tam olarak ne zaman işe yarar? Bu, kullandığınız araçlara ve çerçeveye bağlıdır:

  • Flutter, hata ayıklamada iddiaları etkinleştirir modunda .
  • Dartdevc gibi yalnızca geliştirme araçları, tipik olarak varsayılan olarak iddiaları etkinleştirir.
  • Dart ve dart2js gibi bazı araçlar, bir komut satırı bayrağı aracılığıyla iddiaları destekler: --enable-asserts.

In üretim kodu, iddialar dikkate alınmaz ve assert için argümanlar değerlendirmeye alınmaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.