Как проверить, запущено ли приложение flutter при отладке?

96

У меня короткий вопрос. Я ищу способ выполнить код во Flutter, когда приложение находится в режиме отладки. Возможно ли такое во Flutter? Кажется, я не могу найти его в документации.

Что-то вроде этого

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

Как проверить, работает ли приложение flutter в режиме отладки или выпуска?

Кевин Уолтер
источник
1
Я пробовал assert (() {print ("Debug mode"); return true;}); но это дает мне ошибку, которая не может скомпилироваться. «Профиль», о котором они будут говорить позже, не имеет для меня особого смысла. Не могли бы вы объяснить, как им пользоваться?
Кевин Уолтер

Ответы:

26

Хотя это работает, предпочтительно использовать константы kReleaseModeили kDebugMode. См . Ответ Реми ниже для полного объяснения, который, вероятно, должен быть принятым вопросом.


Самый простой способ - использовать, assertпоскольку он работает только в режиме отладки.

Вот пример из исходного кода 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;
}());

Обратите внимание, в частности, ()в конце вызова - assert может работать только с логическим значением, поэтому простая передача функции не работает.

rmtmckenzie
источник
1
«Особое примечание» было той частью, о которой моя IDE споткнулась. Спасибо огромное!
Кевин Уолтер
5
Когда вы пишете, () { .... }вы определяете функцию, но не вызываете ее. Добавление ()фактически вызывает функцию.
rmtmckenzie
257

Хотя утверждения технически работают, вы не должны их использовать.

Вместо этого используйте константу kReleaseModeизpackage:flutter/foundation.dart


Вся разница в тряске деревьев

Встряхивание дерева (также известное как компилятор, удаляющее неиспользуемый код) зависит от того, являются ли переменные константами.

Проблема в том, что с asserts наше isInReleaseModeлогическое значение не является константой. Поэтому при отправке нашего приложения включены как код разработки, так и код выпуска.

С другой стороны, kReleaseMode является константой. Поэтому компилятор может правильно удалить неиспользуемый код, и мы можем безопасно:

if (kReleaseMode) {

} else {
  // Will be tree-shaked on release builds.
}
Реми Русселе
источник
27
Также небольшое примечание, чтобы избежать загрязнения вашего класса импортом неизвестных, как import 'package:flutter/foundation.dart' as Foundation;Foundation. kReleaseMode
Оливер Диксон
3
Спасибо за объяснение Реми - я выбрал это вместо assert - хороший материал!
Fred
1
Как это так далеко, это должен быть принятый ответ!
Empty2k12
5
Также есть kDebugMode
Александр Скворцов
1
Будет ли дрожание дерева происходить и с виджетами? Итак, если бы я сделал виджет Visibility с visible: kDebugMode, будет ли этот виджет удален компилятором для сборок выпуска?
WiteCastle,
56

эти маленькие фрагменты должны делать то, что вам нужно

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

если нет, вы можете настроить свою IDE для запуска другого main.dartв режиме отладки, где вы можете установить логическое значение.

Адриен Лехард
источник
Я помещаю его как статический в Applicationкласс, чтобы я мог писать Application.isInDebugModeтам, где мне это нужно.
ToniTornado
Очень элегантно, реализовал это в моем приложении.
vrachlin
53

Вот простое решение:

import 'package:flutter/foundation.dart';

тогда вы можете использовать kReleaseModeкак

if(kReleaseMode){ // is Release Mode ??
    print('release mode');
} else {
    print('debug mode');
}
Калпеш Кунданани
источник
20

Не привередничать, но в фундаментный пакет входит kDebugModeконстанта; Так :

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

if(Foundation.kDebugMode) {
   print("App in debug mode");
}
Нирадж
источник
20

kDebugMode

Теперь вы можете использовать kDebugModeконстанту .

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 {

}

Это предпочтительнее, так !kReleaseModeкак он также проверяет режим профиля, то есть kDebugModeозначает, что не в режиме выпуска и не в режиме профиля .

kReleaseMode

Если вы просто хотите проверить режим выпуска, а не режим профиля, вы можете 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

Если вы просто хотите проверить режим профиля, а не режим выпуска, вы можете 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 {

}
творческий
источник
3

Это два шага, чтобы узнать, в каком режиме работает приложение.

  1. Добавьте следующий импорт для получения

    import 'package:flutter/foundation.dart' as Foundation;
    
  2. И kReleaseModeпроверьте, в каком режиме работает приложение

    if(Foundation.kReleaseMode){ 
      print('app release mode');
    } else {
      print('App debug mode');
    }
    
Пареш Мангукия
источник
1

Я считаю, что последний способ сделать это:

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

src

Трэвис Ридер
источник
0

Извлечено из документации Dart :

Когда именно утверждения работают? Это зависит от используемых вами инструментов и фреймворка:

  • Flutter включает утверждения в режиме отладки .
  • Инструменты только для разработки, такие как dartdevc, обычно по умолчанию включают утверждения.
  • Некоторые инструменты, такие как dart и dart2js, поддерживают утверждения с помощью флага командной строки: --enable-asserts.

В производственном коде утверждения игнорируются , а аргументы для утверждения не оцениваются.

teteArg
источник