Як перевірити, працює програма flutter під час налагодження?


96

У мене коротке запитання. Я шукаю спосіб виконати код у Flutter, коли програма перебуває в режимі налагодження. Чи можливо це у Флаттері? Здається, я ніде не можу знайти його в документації.

Щось на зразок цього

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

Як перевірити, чи запущено програму flutter у режимі налагодження чи випуску?



1
Я спробував assert (() {print ("Режим налагодження"); return true;}); але це просто дає мені помилку, яку не вдається скомпілювати. «Профіль», про який вони говорять далі у дописі, для мене не має особливого сенсу. Ви можете пояснити, як ним користуватися?
Кевін Уолтер,

Відповіді:


27

Хоча це працює, використовуючи константи 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 може працювати лише на логічному рівні, тому просто передача функції не працює.


1
"Примітка зокрема" - це та частина, про яку моя IDE спотикалася. Дуже дякую!
Кевін Уолтер,

5
Коли ви пишете, () { .... }ви визначаєте функцію, але не викликаєте її. Додавання ()фактично викликів функції.
rmtmckenzie,

257

Хоча твердження технічно працюють, ви не повинні їх використовувати.

Замість цього використовуйте константу kReleaseModeвідpackage:flutter/foundation.dart


Різниця полягає лише в струшуванні дерев

Тремтіння дерева (він же компілятор, який видаляє невикористаний код) залежить від змінних, що є константами.

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

З іншого боку, kReleaseMode це константа. Тому компілятор може правильно видалити невикористаний код, і ми можемо безпечно зробити:

if (kReleaseMode) {

} else {
  // Will be tree-shaked on release builds.
}

27
Тільки невелика допоміжна записка, аби уникнути забруднення вашого класу невідомими import 'package:flutter/foundation.dart' as Foundation;Foundation. kReleaseMode
Олівер Діксон,

3
Дякую за пояснення Ремі - я вибрав це замість твердження - хороша штука!
Фред

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';

тоді можна використовувати kReleaseModelike

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');
    }
    


0

Витягнуто з документації Dart :

Коли саме працюють твердження? Це залежить від інструментів та фреймворку, які ви використовуєте:

  • Flutter дозволяє твердження в режимі налагодження .
  • Інструменти, призначені лише для розробки, такі як dartdevc, типово включають твердження.
  • Деякі інструменти, такі як dart і dart2js, підтримують твердження через прапор командного рядка: --enable-asserts.

У виробничому коді твердження ігноруються , а аргументи для затвердження не обробляються.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.