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


100

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

像这样

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

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



1
我试过assert((){print(“ Debug mode”); return true;}); 但这给了我一个无法编译的错误。他们在帖子的后面谈论的“个人资料”对我来说意义不大。您能解释一下如何使用它吗?
凯文·沃尔特

Answers:


33

虽然这可行,但最好使用常量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只能对布尔值进行操作,因此仅传入函数是行不通的。


1
“特别注意”是我的IDE绊倒的部分。非常感谢!
凯文·沃尔特

5
在编写时,() { .... }您是在定义函数,而不是调用它。添加()实际调用的函数。
rmtmckenzie

269

尽管断言在技术上可行,但您不应使用它们。

而是使用kReleaseMode来自package:flutter/foundation.dart


区别在于摇树

摇树(也就是编译器删除未使用的代码)取决于变量是常量。

问题在于,断言我们的isInReleaseMode布尔值不是常数。因此,在交付我们的应用程序时,将同时包含开发和发布代码。

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

if (kReleaseMode) {

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

29
还要注意一点,为避免污染您的班级,import 'package:flutter/foundation.dart' as Foundation;您可以按照以下说明进行未知输入,然后您可以这样做Foundation. kReleaseMode
Oliver Dixon,

3
感谢您对Remi的解释-我选择了它而不是断言-好东西!
弗雷德

1
到目前为止如何,这应该是公认的答案!
Empty2k12

5
也有 kDebugMode
Alexander Skvortsov

1
小部件也会发生树状震动吗?因此,如果我对Visibility小部件进行了可见处理:kDebugMode,该小部件会被编译器删除以进行发行吗?
WiteCastle

56

这些小片段应该可以满足您的需求

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

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


我把它作为静态Application类放在类中,这样我就可以Application.isInDebugMode在需要的地方写。
ToniTornado

非常优雅,在我的应用程序中实现了这一点。
vrachlin

56

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

import 'package:flutter/foundation.dart';

那么你可以使用kReleaseMode

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

27

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 {

}

20

不要挑剔,但基础包中包含一个kDebugMode常量;因此:

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

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

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支持断言。

生产代码中,断言将被忽略,并且不会评估断言的参数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.