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?
flutter
debugging
dart
flutter-run
flutter-debug
Kevin Walter
źródło
źródło
Odpowiedzi:
Chociaż to działa, preferowane jest używanie stałych
kReleaseMode
lubkDebugMode
. Zobacz odpowiedź Remiego poniżej, aby uzyskać pełne wyjaśnienie, które prawdopodobnie powinno być zaakceptowanym pytaniem.Najłatwiej jest użyć,
assert
ponieważ 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.źródło
() { .... }
, definiujesz funkcję, ale jej nie wywołujesz. Dodanie w()
rzeczywistości wywołuje funkcję.Chociaż potwierdzenia działają technicznie, nie należy ich używać.
Zamiast tego użyj stałej
kReleaseMode
frompackage: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ść
isInReleaseMode
logiczna 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. }
źródło
import 'package:flutter/foundation.dart' as Foundation;
potem można zrobićFoundation. kReleaseMode
kDebugMode
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.dart
w trybie debugowania, w którym możesz ustawić wartość logiczną.źródło
Application
klasie, więc mogę pisaćApplication.isInDebugMode
tam, gdzie tego potrzebuję.Oto proste rozwiązanie tego problemu:
import 'package:flutter/foundation.dart';
wtedy możesz użyć
kReleaseMode
likeif(kReleaseMode){ // is Release Mode ?? print('release mode'); } else { print('debug mode'); }
źródło
kDebugMode
Możesz teraz użyć
kDebugMode
stał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
!kReleaseMode
jak również sprawdza trybie profilu, tjkDebugMode
znaczy nie w uwalnianiu trybie a nie w profilu trybie .kReleaseMode
Jeśli chcesz tylko sprawdzić tryb zwolnienia, a nie tryb profilu, możesz
kReleaseMode
zamiast 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
kProfileMode
zamiast 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 { }
źródło
Nie być wybrednym, ale pakiet fundamentów zawiera
kDebugMode
stałą; Więc :import 'package:flutter/foundation.dart' as Foundation; if(Foundation.kDebugMode) { print("App in debug mode"); }
źródło
Są to dwa kroki, aby dowiedzieć się, w jakim trybie działa aplikacja
Dodaj następujące importy do pobierania
import 'package:flutter/foundation.dart' as Foundation;
I
kReleaseMode
sprawdź, w jakim trybie działa aplikacjaif(Foundation.kReleaseMode){ print('app release mode'); } else { print('App debug mode'); }
źródło
Uważam, że najnowszym sposobem na to jest:
const bool prod = const bool.fromEnvironment('dart.vm.product');
src
źródło
Wyodrębniono z dokumentacji Dart :
źródło