Como verificar se o aplicativo flutter está sendo executado na depuração?

101

Eu tenho uma pergunta curta. Estou procurando uma maneira de executar código no Flutter quando o aplicativo está no modo de depuração. Isso é possível no Flutter? Não consigo encontrar em nenhum lugar da documentação.

Algo assim

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

Como verificar se o aplicativo flutter está sendo executado no modo de depuração ou liberação?

Kevin Walter
fonte
1
Tentei assert (() {print ("modo de depuração"); return true;}); mas isso me dá um erro que não consigo compilar. O "Perfil" sobre o qual eles estão falando mais adiante na postagem não faz muito sentido para mim. Você pode explicar como usá-lo?
Kevin Walter,

Respostas:

33

Enquanto isso funciona, usar constantes kReleaseModeou kDebugModeé preferível. Veja a resposta de Rémi abaixo para uma explicação completa, que provavelmente deve ser a pergunta aceita.


A maneira mais fácil é usar assert, pois só funciona no modo de depuração.

Aqui está um exemplo do código-fonte do 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;
}());

Observe em particular o ()no final da chamada - assert só pode operar em um booleano, portanto, apenas passar uma função não funciona.

rmtmckenzie
fonte
1
A "Nota em particular" era a parte em que meu IDE estava tropeçando. Muito obrigado!
Kevin Walter,
5
Quando você escreve, () { .... }você define a função, mas não a chama. Adicionar o ()realmente chama a função.
rmtmckenzie
269

Embora asserts funcione tecnicamente, você não deve usá-los.

Em vez disso, use a constante kReleaseModedepackage:flutter/foundation.dart


A diferença está no tremor das árvores

A agitação da árvore (também conhecida como o compilador removendo o código não utilizado) depende das variáveis ​​serem constantes.

O problema é que, com afirma, nosso isInReleaseModebooleano não é uma constante. Portanto, ao enviar nosso aplicativo, o código de desenvolvimento e o código de lançamento são incluídos.

Por outro lado, kReleaseMode é uma constante. Portanto, o compilador é capaz de remover corretamente o código não utilizado, e podemos fazer com segurança:

if (kReleaseMode) {

} else {
  // Will be tree-shaked on release builds.
}
Rémi Rousselet
fonte
29
Apenas uma pequena observação também, para evitar a poluição de sua classe com coisas desconhecidas, como seguir import 'package:flutter/foundation.dart' as Foundation;, você pode fazerFoundation. kReleaseMode
Oliver Dixon
3
Obrigado por explicar Remi - eu escolhi isso em vez de afirmar - coisas boas!
Fred
1
Como isso é tão baixo, essa deve ser a resposta aceita!
Empty2k12
5
Também há kDebugMode
Alexander Skvortsov,
1
O tremor de árvore também ocorrerá com widgets? Portanto, se eu fizesse um widget Visibility com visible: kDebugMode, esse widget seria removido pelo compilador para versões de lançamento?
WiteCastle
57

esses pequenos trechos devem fazer o que você precisa

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

caso contrário, você pode configurar seu IDE para lançar um diferente main.dartno modo de depuração, onde você pode definir um booleano.

Hadrien Lejard
fonte
Eu o coloquei como estático em uma Applicationclasse para poder escrever Application.isInDebugModeonde preciso.
ToniTornado
Muito elegante, implementei isso no meu app.
vrachlin
56

Aqui está uma solução simples para isso:

import 'package:flutter/foundation.dart';

então você pode usar kReleaseModecomo

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

kDebugMode

Agora você pode usar a 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 {

}

Isso é preferível !kReleaseMode, pois também verifica o modo de perfil, ou seja, kDebugModesignifica não no modo de liberação e não no modo de perfil .

kReleaseMode

Se você deseja apenas verificar o modo de liberação e não o modo de perfil, pode usar kReleaseMode:

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

Se você deseja apenas verificar o modo de perfil e não o modo de liberação, pode usar kProfileMode:

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
fonte
20

Não seja exigente, mas o pacote básico inclui uma kDebugModeconstante; Então :

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

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

Estas são as duas etapas para descobrir em qual modo o aplicativo é executado

  1. Adicione as seguintes importações para obter

    import 'package:flutter/foundation.dart' as Foundation;
    
  2. E kReleaseModeverifique em qual modo o aplicativo está rodando

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

Acredito que a maneira mais recente de fazer isso é:

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

src

Travis Reeder
fonte
0

Extraído da documentação do Dart :

Quando exatamente as asserções funcionam? Isso depende das ferramentas e da estrutura que você está usando:

  • Flutter ativa asserções no modo de depuração .
  • Ferramentas apenas de desenvolvimento, como dartdevc, normalmente habilitam asserções por padrão.
  • Algumas ferramentas, como dart e dart2js, suportam asserções por meio de um sinalizador de linha de comando: --enable-asserts.

No código de produção , as asserções são ignoradas e os argumentos a serem declarados não são avaliados.

teteArg
fonte