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

Flutter 如何检查颤振应用程序是否在调试中运行?,flutter,debugging,dart,flutter-run,flutter-debug,Flutter,Debugging,Dart,Flutter Run,Flutter Debug,我有一个简短的问题。我正在寻找一种在应用程序处于调试模式时以Flutter方式执行代码的方法。这在颤振中是可能的吗?我似乎在文档中的任何地方都找不到它 像这样的 If(app.inDebugMode) { print("Print only in debug mode"); } 如何检查颤振应用程序是否在调试或发布模式下运行? 当这起作用时,最好使用常量kReleaseMode或kDebugMode。请参阅下面的完整解释,这可能是公认的问题 最简单的方法是使用ass

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

像这样的

If(app.inDebugMode) {
   print("Print only in debug mode");
}
如何检查颤振应用程序是否在调试或发布模式下运行?


当这起作用时,最好使用常量
kReleaseMode
kDebugMode
。请参阅下面的完整解释,这可能是公认的问题


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

下面是来自Flatter的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只能对布尔值进行操作,因此仅传入函数是不起作用的。

Update 请将Remi的答案与
kReleaseMode
kDebugMode
一起使用,否则Dart编译将无法对代码进行树震动


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

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

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

这里有一个简单的解决方案:

import 'package:flutter/foundation.dart';
然后您可以像这样使用
kReleaseMode

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

虽然断言在技术上有效,但不应使用它们

相反,使用
包中的常量
kReleaseMode
:flatter/foundation.dart


区别在于树木的晃动

树抖动(即编译器删除未使用的代码)取决于变量是否为常量

问题是,对于断言,我们的
isInReleaseMode
boolean不是一个常量。因此,在发布我们的应用程序时,同时包含了开发代码和发布代码

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

if (kReleaseMode) {

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

不挑剔,但基础包包括<代码> kDebug模式< /代码>常数; 因此:

从Dart中提取:

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

  • 颤振在调试模式下启用断言
  • 默认情况下,只有开发工具(如dartdevc)才能启用断言
  • 有些工具,如dart和dart2js,通过命令行标志支持断言:--启用断言
生产代码中,断言被忽略,并且 未对断言进行求值

您现在可以使用

if(kDebugMode){
//此处的代码将仅包含在调试模式中。
//由于kDebugMode是一个常数,因此树震动器
//将从编译后的代码中完全删除代码。
}否则{
}
这比
更可取!kReleaseMode
还检查配置文件模式,即
kDebugMode
表示未处于释放模式未处于配置文件模式

如果您只想检查释放模式而不想检查配置文件模式,则可以使用
kReleaseMode

if(kReleaseMode){
//此处的代码将仅在发布模式下运行。
//因为kReleaseMode是一个常数,所以摇树器
//将从其他版本中完全删除代码。
}否则{
}
如果您只想检查配置文件模式而不想检查发布模式,则可以改用
kProfileMode

if(kProfileMode){
//此处的代码将仅在发布模式下运行。
//由于kProfileMode是一个常数,树震动器
//将从其他版本中完全删除代码。
}否则{
}

我认为最新的方法是:

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

这是确定应用程序运行模式的两个步骤

  • 添加以下导入以获取

    import 'package:flutter/foundation.dart' as Foundation;
    
  • kReleaseMode
    检查应用程序运行的模式

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

  • 我尝试了断言((){print(“Debug mode”);return true;});但这只是给了我一个无法编译的错误。他们稍后在帖子中谈论的“个人资料”对我来说没有多大意义。你能解释一下如何使用它吗?“特别注意”是我的IDE被绊倒的部分。非常感谢你!当您编写
    (){..}
    时,您正在定义函数,但没有调用它。添加
    ()
    实际上调用了该函数。我将其作为静态函数放在
    应用程序
    类中,这样我就可以编写
    应用程序。isInDebugMode
    在我需要它的地方。非常优雅,在我的应用程序中实现了这一点。还有一个小提示,为了避免污染,您的未知类导入如下:代码>导入包:颤动/基础。代码>然后你就可以做
    Foundation了。kReleaseMode
    到目前为止情况如何,这应该是公认的答案!还有
    kDebugMode
    小部件也会发生树抖动吗?因此,如果我使用visible:kDebugMode创建了一个可见性小部件,那么编译器会在发布版本中删除该小部件吗?我们还可以知道.apk是否使用相同的常量签名
    signingConfigs.debug
    if(Foundation.kReleaseMode){ 
      print('app release mode');
    } else {
      print('App debug mode');
    }