¿Cómo comprobar que la aplicación Flutter se está ejecutando en depuración?

96

Tengo una breve pregunta. Estoy buscando una forma de ejecutar código en Flutter cuando la aplicación está en modo de depuración. ¿Es eso posible en Flutter? Parece que no puedo encontrarlo en ninguna parte de la documentación.

Algo como esto

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

¿Cómo comprobar si la aplicación Flutter se está ejecutando en modo de depuración o liberación?

Kevin Walter
fuente
1
Intenté aseverar (() {imprimir ("Modo de depuración"); devolver verdadero;}); pero eso solo me da un error que no se puede compilar. El "Perfil" del que están hablando más adelante en la publicación no tiene mucho sentido para mí. ¿Puedes explicar cómo se usa?
Kevin Walter

Respuestas:

26

Si bien esto funciona, es preferible usar constantes kReleaseModeo kDebugMode. Consulte la respuesta de Rémi a continuación para obtener una explicación completa, que probablemente debería ser la pregunta aceptada.


La forma más sencilla es utilizarlo, assertya que solo se ejecuta en modo de depuración.

Aquí hay un ejemplo del código fuente de 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;
}());

Tenga en cuenta en particular que ()al final de la llamada: assert solo puede operar en un booleano, por lo que simplemente pasar una función no funciona.

rmtmckenzie
fuente
1
La "Nota en particular" fue la parte con la que se tropezó mi IDE. Muchas gracias!
Kevin Walter
5
Cuando escribe () { .... }, define la función, pero no la llama. Agregar el ()realmente llama a la función.
rmtmckenzie
257

Si bien afirma que técnicamente funciona, no debes usarlos.

En su lugar, use la constante kReleaseModedepackage:flutter/foundation.dart


La diferencia se trata de sacudir árboles

La agitación de árboles (también conocida como el compilador que elimina el código no utilizado) depende de que las variables sean constantes.

El problema es que con afirma que nuestro isInReleaseModebooleano no es una constante. Entonces, al enviar nuestra aplicación, se incluyen tanto el código de desarrollo como el de lanzamiento.

Por otro lado, kReleaseMode es una constante. Por lo tanto, el compilador puede eliminar correctamente el código no utilizado, y podemos hacer con seguridad:

if (kReleaseMode) {

} else {
  // Will be tree-shaked on release builds.
}
Rémi Rousselet
fuente
27
Solo una pequeña nota al margen también, para evitar la contaminación, su clase con incógnitas importa como seguir y import 'package:flutter/foundation.dart' as Foundation;luego puede hacerloFoundation. kReleaseMode
Oliver Dixon
3
Gracias por explicar Remi, elegí esto en lugar de afirmar, ¡muy bien!
Fred
1
¿Cómo es esto tan bajo? ¡Esta debería ser la respuesta aceptada!
Empty2k12
5
También hay kDebugMode
Alexander Skvortsov
1
¿También se producirán sacudidas de árboles con los widgets? Entonces, si hice un widget de visibilidad con visible: kDebugMode, ¿el compilador eliminará ese widget para las versiones de lanzamiento?
WiteCastle
56

estos pequeños fragmentos deberían hacer lo que necesitas

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

de lo contrario, puede configurar su IDE para que inicie un main.dartmodo de depuración diferente donde puede establecer un booleano.

Hadrien Lejard
fuente
Lo pongo como estático en una Applicationclase para poder escribir Application.isInDebugModedonde lo necesito.
ToniTornado
Muy elegante, implementé esto en mi aplicación.
vrachlin
53

Aquí hay una solución simple para esto:

import 'package:flutter/foundation.dart';

entonces puedes usar kReleaseModelike

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

No quiero ser quisquilloso, pero el paquete básico incluye una kDebugModeconstante; Entonces :

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

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

kDebugMode

Ahora puede usar la kDebugModeconstante .

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 {

}

Esto es preferible !kReleaseModeya que también verifica el modo de perfil, es decir, kDebugModesignifica que no está en modo de liberación y no en modo de perfil .

kReleaseMode

Si solo desea verificar el modo de liberación y no el modo de perfil, puede usar kReleaseModeen su lugar:

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

Si solo desea verificar el modo de perfil y no el modo de liberación, puede usar kProfileModeen su lugar:

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
fuente
3

Estos son los dos pasos para averiguar en qué modo se ejecuta la aplicación

  1. Agregue las siguientes importaciones para obtener

    import 'package:flutter/foundation.dart' as Foundation;
    
  2. Y kReleaseModeverifique en qué modo se está ejecutando la aplicación

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

Creo que la última forma de hacer esto es:

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

src

Travis Reeder
fuente
0

Extraído de la documentación de Dart :

¿Cuándo funcionan exactamente las afirmaciones? Eso depende de las herramientas y el marco que esté utilizando:

  • Flutter habilita las afirmaciones en modo de depuración .
  • Las herramientas solo de desarrollo, como dartdevc, suelen habilitar las afirmaciones de forma predeterminada.
  • Algunas herramientas, como dart y dart2js, admiten afirmaciones a través de una marca de línea de comandos: --enable-asserts.

En el código de producción , las afirmaciones se ignoran y los argumentos para afirmar no se evalúan.

teteArg
fuente