Jak sprawdzić, czy aplikacja flutter działa podczas debugowania?


101

Mam krótkie pytanie. Szukam sposobu na wykonanie kodu w Flutter, gdy aplikacja jest w trybie debugowania. Czy to możliwe we Flutterze? Nie mogę znaleźć tego nigdzie w dokumentacji.

Coś takiego

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

Jak sprawdzić, czy aplikacja flutter działa w trybie debugowania lub wydania?



1
Próbowałem assert (() {print ("Tryb debugowania"); powrót prawda;}); ale to po prostu daje mi błąd, którego nie można skompilować. „Profil”, o którym mówią w dalszej części postu, nie ma dla mnie większego sensu. Czy możesz wyjaśnić, jak go używać?
Kevin Walter,

Odpowiedzi:


33

Chociaż to działa, preferowane jest używanie stałych kReleaseModelub kDebugMode. Zobacz odpowiedź Remiego poniżej, aby uzyskać pełne wyjaśnienie, które prawdopodobnie powinno być zaakceptowanym pytaniem.


Najłatwiej jest użyć, assertponieważ działa tylko w trybie debugowania.

Oto przykład z kodu źródłowego Flutter's Navigator:

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

Zwróć uwagę w szczególności ()na koniec wywołania - assert może działać tylko na boolowskim, więc samo przekazanie funkcji nie działa.


1
„Uwaga w szczególności” była częścią, o którą potykało się moje IDE. Dziękuję bardzo!
Kevin Walter

5
Kiedy piszesz () { .... }, definiujesz funkcję, ale jej nie wywołujesz. Dodanie w ()rzeczywistości wywołuje funkcję.
rmtmckenzie

270

Chociaż potwierdzenia działają technicznie, nie należy ich używać.

Zamiast tego użyj stałej kReleaseModefrompackage:flutter/foundation.dart


Różnica polega na drżeniu drzew

Potrząsanie drzewem (inaczej kompilator usuwający nieużywany kod) zależy od stałych zmiennych.

Problem polega na tym, że w przypadku potwierdzeń nasza wartość isInReleaseModelogiczna nie jest stała. Dlatego wysyłając naszą aplikację, dołączamy zarówno kod deweloperski, jak i kod wydania.

Z drugiej strony kReleaseMode jest stała. Dlatego kompilator jest w stanie poprawnie usunąć nieużywany kod i możemy bezpiecznie zrobić:

if (kReleaseMode) {

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

29
Tylko mała dygresja, jak również, aby uniknąć zanieczyszczenia swoją klasę z niewiadomych jak importować następujące import 'package:flutter/foundation.dart' as Foundation;potem można zrobićFoundation. kReleaseMode
Oliver Dixon

3
Dzięki za wyjaśnienie Remi - wybrałem to zamiast zapewnienia - dobra rzecz!
Fred

1
Jak to jest tak daleko, to powinna być akceptowana odpowiedź!
Empty2k12

5
Jest też kDebugMode
Alexander Skvortsov

1
Czy drzewo się trzęsie również w przypadku widżetów? Więc jeśli zrobiłem widżet Visibility z visible: kDebugMode, czy ten widżet zostanie usunięty przez kompilator dla kompilacji wydania?
WiteCastle

57

te małe fragmenty powinny zrobić to, czego potrzebujesz

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

jeśli nie, możesz skonfigurować swoje IDE, aby uruchamiało inne main.dartw trybie debugowania, w którym możesz ustawić wartość logiczną.


Umieściłem to jako statyczne w Applicationklasie, więc mogę pisać Application.isInDebugModetam, gdzie tego potrzebuję.
ToniTornado

Bardzo eleganckie, zaimplementowałem to w mojej aplikacji.
vrachlin

56

Oto proste rozwiązanie tego problemu:

import 'package:flutter/foundation.dart';

wtedy możesz użyć kReleaseModelike

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

28

kDebugMode

Możesz teraz użyć kDebugModestałej .

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 {

}

To preferrable nad !kReleaseModejak również sprawdza trybie profilu, tj kDebugModeznaczy nie w uwalnianiu trybie a nie w profilu trybie .

kReleaseMode

Jeśli chcesz tylko sprawdzić tryb zwolnienia, a nie tryb profilu, możesz kReleaseModezamiast tego użyć :

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

Jeśli chcesz tylko sprawdzić tryb profilu, a nie tryb zwolnienia, możesz kProfileModezamiast tego użyć :

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 {

}

20

Nie być wybrednym, ale pakiet fundamentów zawiera kDebugModestałą; Więc :

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

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

3

Są to dwa kroki, aby dowiedzieć się, w jakim trybie działa aplikacja

  1. Dodaj następujące importy do pobierania

    import 'package:flutter/foundation.dart' as Foundation;
    
  2. I kReleaseModesprawdź, w jakim trybie działa aplikacja

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

2

Uważam, że najnowszym sposobem na to jest:

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

src


0

Wyodrębniono z dokumentacji Dart :

Kiedy dokładnie działają asercje? To zależy od używanych narzędzi i frameworka:

  • Flutter włącza asercje w trybie debugowania .
  • Narzędzia przeznaczone tylko do programowania, takie jak dartdevc, zazwyczaj domyślnie włączają asercje.
  • Niektóre narzędzia, takie jak dart i dart2js, obsługują potwierdzenia za pomocą flagi wiersza polecenia: --enable-asserts.

W kodzie produkcyjnym potwierdzenia są ignorowane , a argumenty do potwierdzenia nie są oceniane.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.