Ich habe eine kurze Frage. Ich suche nach einer Möglichkeit, Code in Flutter auszuführen, wenn sich die App im Debug-Modus befindet. Ist das in Flutter möglich? Ich kann es anscheinend nirgendwo in der Dokumentation finden.
Etwas wie das
If(app.inDebugMode) {
print("Print only in debug mode");
}
Wie überprüfe ich, ob die Flatteranwendung im Debug- oder Release-Modus ausgeführt wird?
flutter
debugging
dart
flutter-run
flutter-debug
Kevin Walter
quelle
quelle
Antworten:
Während dies funktioniert, ist die Verwendung von Konstanten
kReleaseMode
oderkDebugMode
vorzuziehen. In Rémis Antwort unten finden Sie eine vollständige Erklärung, die wahrscheinlich die akzeptierte Frage sein sollte.Am einfachsten ist die Verwendung,
assert
da sie nur im Debug-Modus ausgeführt wird.Hier ist ein Beispiel aus Flatters Navigator-Quellcode:
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; }());
Beachten Sie insbesondere, dass
()
am Ende des Aufrufs - assert nur mit einem Booleschen Wert ausgeführt werden kann, sodass die Übergabe einer Funktion nicht funktioniert.quelle
() { .... }
, definieren Sie die Funktion, rufen sie jedoch nicht auf. Das Hinzufügen der()
ruft tatsächlich die Funktion auf.Während Asserts technisch funktioniert, sollten Sie sie nicht verwenden.
Verwenden Sie stattdessen die Konstante
kReleaseMode
vonpackage:flutter/foundation.dart
Der Unterschied besteht im Baumschütteln
Das Schütteln von Bäumen (auch bekannt als der Compiler, der nicht verwendeten Code entfernt) hängt davon ab, dass Variablen Konstanten sind.
Das Problem ist, mit Behauptungen, dass unser
isInReleaseMode
Boolescher Wert keine Konstante ist. Beim Versand unserer App sind also sowohl der Entwickler- als auch der Release-Code enthalten.Auf der anderen Seite
kReleaseMode
ist eine Konstante. Daher kann der Compiler nicht verwendeten Code korrekt entfernen, und wir können dies sicher tun:if (kReleaseMode) { } else { // Will be tree-shaked on release builds. }
quelle
import 'package:flutter/foundation.dart' as Foundation;
dann können Sie tunFoundation. kReleaseMode
kDebugMode
Diese kleinen Schnipsel sollten das tun, was Sie brauchen
bool get isInDebugMode { bool inDebugMode = false; assert(inDebugMode = true); return inDebugMode; }
Wenn nicht, können Sie Ihre IDE so konfigurieren, dass
main.dart
im Debug-Modus eine andere IDE gestartet wird, in der Sie einen Booleschen Wert festlegen können.quelle
Application
Klasse eingefügt, damit ich dort schreiben kann,Application.isInDebugMode
wo ich es brauche.Hier ist eine einfache Lösung dafür:
import 'package:flutter/foundation.dart';
dann kannst du
kReleaseMode
gerne verwendenif(kReleaseMode){ // is Release Mode ?? print('release mode'); } else { print('debug mode'); }
quelle
Nicht wählerisch zu sein, aber das Grundpaket enthält eine
kDebugMode
Konstante; Damit :import 'package:flutter/foundation.dart' as Foundation; if(Foundation.kDebugMode) { print("App in debug mode"); }
quelle
kDebugMode
Sie können jetzt die
kDebugMode
Konstante verwenden .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 { }
Dies ist preferrable über ,
!kReleaseMode
wie es auch überprüft Profil - Modus, dhkDebugMode
bedeutet nicht in Release - Modus und nicht im Profil - Modus .kReleaseMode
Wenn Sie nur nach dem Freigabemodus und nicht nach dem Profilmodus suchen möchten , können Sie
kReleaseMode
stattdessen Folgendes verwenden: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
Wenn Sie nur für überprüfen möchten Profilmodus und nicht für Release - Modus, können Sie
kProfileMode
stattdessen: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 { }
quelle
Dies sind die beiden Schritte, um herauszufinden, in welchem Modus die Anwendung ausgeführt wird
Fügen Sie die folgenden Importe zum Abrufen hinzu
import 'package:flutter/foundation.dart' as Foundation;
Und
kReleaseMode
überprüfen Sie, welcher Modus die Anwendung läuftif(Foundation.kReleaseMode){ print('app release mode'); } else { print('App debug mode'); }
quelle
Ich glaube, der neueste Weg, dies zu tun, ist:
const bool prod = const bool.fromEnvironment('dart.vm.product');
src
quelle
Auszug aus der Dart- Dokumentation :
quelle