Wie überprüfe ich, ob die Flatteranwendung im Debug ausgeführt wird?

96

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?

Kevin Walter
quelle
1
Ich habe versucht, assert (() {print ("Debug-Modus"); return true;}); Aber das gibt mir nur einen Fehler, der nicht kompiliert werden kann. Das "Profil", über das sie später in diesem Beitrag sprechen, macht für mich wenig Sinn. Können Sie bitte erklären, wie man es benutzt?
Kevin Walter

Antworten:

27

Während dies funktioniert, ist die Verwendung von Konstanten kReleaseModeoder kDebugModevorzuziehen. In Rémis Antwort unten finden Sie eine vollständige Erklärung, die wahrscheinlich die akzeptierte Frage sein sollte.


Am einfachsten ist die Verwendung, assertda 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.

rmtmckenzie
quelle
1
Die "Notiz im Besonderen" war der Teil, über den meine IDE stolperte. Ich danke dir sehr!
Kevin Walter
5
Wenn Sie schreiben () { .... }, definieren Sie die Funktion, rufen sie jedoch nicht auf. Das Hinzufügen der ()ruft tatsächlich die Funktion auf.
rmtmckenzie
257

Während Asserts technisch funktioniert, sollten Sie sie nicht verwenden.

Verwenden Sie stattdessen die Konstante kReleaseModevonpackage: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 isInReleaseModeBoolescher 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.
}
Rémi Rousselet
quelle
27
Auch nur eine kleine Randnotiz, die Verschmutzung Ihrer Klasse zu vermeiden , mit Unbekannten wie folgt importieren , import 'package:flutter/foundation.dart' as Foundation;dann können Sie tunFoundation. kReleaseMode
Oliver Dixon
3
Danke, dass du Remi erklärt hast - ich habe das gewählt, anstatt zu behaupten - gutes Zeug!
Fred
1
Wie ist das so weit unten, das sollte die akzeptierte Antwort sein!
Empty2k12
5
Auch gibt es kDebugMode
Alexander Skvortsov
1
Wird es bei Widgets auch zu Baumschütteln kommen? Wenn ich also ein Sichtbarkeits-Widget mit sichtbarem: kDebugMode erstellt habe, wird dieses Widget vom Compiler für Release-Builds entfernt?
WiteCastle
56

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.dartim Debug-Modus eine andere IDE gestartet wird, in der Sie einen Booleschen Wert festlegen können.

Hadrien Lejard
quelle
Ich habe es als statisch in eine ApplicationKlasse eingefügt, damit ich dort schreiben kann, Application.isInDebugModewo ich es brauche.
ToniTornado
Sehr elegant, dies in meiner App implementiert.
Vrachlin
53

Hier ist eine einfache Lösung dafür:

import 'package:flutter/foundation.dart';

dann kannst du kReleaseModegerne verwenden

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

Nicht wählerisch zu sein, aber das Grundpaket enthält eine kDebugModeKonstante; Damit :

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

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

kDebugMode

Sie können jetzt die kDebugModeKonstante 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 , !kReleaseModewie es auch überprüft Profil - Modus, dh kDebugModebedeutet 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 kReleaseModestattdessen 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 kProfileModestattdessen:

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 {

}
CreativeCreatorormaybenot
quelle
3

Dies sind die beiden Schritte, um herauszufinden, in welchem ​​Modus die Anwendung ausgeführt wird

  1. Fügen Sie die folgenden Importe zum Abrufen hinzu

    import 'package:flutter/foundation.dart' as Foundation;
    
  2. Und kReleaseModeüberprüfen Sie, welcher Modus die Anwendung läuft

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

Ich glaube, der neueste Weg, dies zu tun, ist:

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

src

Travis Reeder
quelle
0

Auszug aus der Dart- Dokumentation :

Wann genau funktionieren Behauptungen? Das hängt von den Tools und dem Framework ab, die Sie verwenden:

  • Flutter aktiviert Zusicherungen im Debug- Modus.
  • Nur-Entwicklungstools wie dartdevc aktivieren normalerweise standardmäßig Zusicherungen.
  • Einige Tools, wie z. B. dart und dart2js, unterstützen Zusicherungen über ein Befehlszeilenflag: --enable-asserts.

Im Produktionscode werden Zusicherungen ignoriert und die durchzusetzenden Argumente werden nicht ausgewertet.

teteArg
quelle