如何检查 Flutter 应用程序是否在调试中运行



我正在寻找一种在应用程序处于调试模式时在 Flutter 中执行代码的方法。这在 Flutter 中可能吗?我似乎在文档中的任何地方都找不到它。

像这样的东西

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

如何检查 Flutter 应用程序是否在调试或发布模式下运行?

在更高版本中,您可以使用kDebugMode

if (kDebugMode)
  doSomething();
<小时 />

虽然断言在技术上可用于手动创建"是调试模式"变量,但您应该避免这种情况。

请改用 package:flutter/foundation.dart 中的常量kReleaseMode

<小时 />

区别在于树摇晃。

树摇动(又名编译器删除未使用的代码(取决于变量是常量。

问题是,断言我们的isInReleaseMode布尔值是一个常数。因此,在发布我们的应用程序时,会包含开发和发布代码。

另一方面,kReleaseMode是一个常数。因此,编译器能够正确地删除未使用的代码,我们可以安全地执行以下操作:

if (kReleaseMode) {
} else {
  // Will be tree-shaked on release builds.
}
<</div> div class="one_answers">

这是一个简单的解决方案:

import 'package:flutter/foundation.dart';

然后你可以使用kReleaseMode

if(kReleaseMode){ // Is Release Mode??
    print('release mode');
} else {
    print('debug mode');
}

请使用Remi的答案kReleaseModekDebugMode否则Dart编译将无法动摇您的代码。

<小时 />

这个小片段应该做你需要的:

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

如果没有,则可以将 IDE 配置为在调试模式下启动不同的main.dart,在该模式下可以设置布尔值。

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 {
}

虽然这有效,但最好使用常量kReleaseModekDebugMode。有关完整的解释,请参阅下面的Rémi的答案,这可能是公认的问题。

<小时 />

最简单的方法是使用 assert,因为它只在调试模式下运行。

以下是 Flutter 的 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 只能在布尔值上运行,因此仅传入函数不起作用。

不要挑剔,但基础包包含一个kDebugMode常量。

所以:

import 'package:flutter/foundation.dart' as Foundation;
if(Foundation.kDebugMode) {
   print("App in debug mode");
}
我相信

最新的方法是:

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

来源

只需导入此

import 'package:flutter/foundation.dart' 

String bulid = kReleaseMode ? "Release" : "";
or
String bulid = kDebugMode ? "Debug" : "";
or
String bulid = kProfileMode ? "Profile" : "";

或者试试这个

if (kDebugMode) {
   print("Debug");
} else if (kReleaseMode) {
    print("Release"); 
} else if (kProfileMode) {
  print("Profile"); 
}

我根据其他答案创建了这个有用的类,并受到Android使用的启发。如果"Foundation"包有任何更改,则无需更改整个应用程序,只需更改此类。

import 'package:flutter/foundation.dart' as Foundation;
abstract class Build {
    static const bool isDebugMode = Foundation.kDebugMode;
    static const bool isReleaseMode = Foundation.kReleaseMode;
    static const bool isWeb = Foundation.kIsWeb;
    static const bool isProfileMode = Foundation.kProfileMode;
}

创建一个名为constants.dart的文件。在其中添加以下变量:

const bool kReleaseMode = bool.fromEnvironment('dart.vm.product');
const bool kProfileMode = bool.fromEnvironment('dart.vm.profile');
const bool kDebugMode = !kReleaseMode && !kProfileMode;
printk(String string) {
  if (kDebugMode) {
    // ignore: avoid_print
    print(string);
  }
}

然后将此常量文件导入任何其他文件中,并像这样使用它:

    import 'package:package_name/constants.dart';
    if(kDebugMode){
        //Debug code
    }else{
        //Non-Debug code
    }
    printk("Debug Log");
<</div> div class="one_answers">你可以

使用Flutter的基础库。你可以得到debugprofilerelease

import 'package:flutter/foundation.dart';

然后

if (kDebugMode) {
  // debug code
}
if (kProfileMode) {
 // profile code
}
if (kReleaseMode) {
    // release code
}

摘自Dart文档:

断言究竟什么时候起作用?这取决于工具和 您正在使用的框架:

  • Flutter 在调试模式下启用断言。
  • 仅开发工具(如 dartdevc(通常默认启用断言。
  • 一些工具,如 dart 和 dart2js,支持通过命令行标志的断言:--enable-asserts。

生产代码中,断言被忽略,参数 不评估断言。

相关内容

  • 没有找到相关文章

最新更新