183

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

像这样的东西

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

如何检查颤振应用程序是在调试还是发布模式下运行?

4

11 回答 11

431

更新您现在可以使用kDebugMode

if (kDebugMode)
  doSomething();

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

相反,使用kReleaseMode来自的常量package:flutter/foundation.dart


不同之处在于摇树

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

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

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

if (kReleaseMode) {

} else {
  // Will be tree-shaked on release builds.
}
于 2019-04-10T12:39:12.687 回答
84

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

import 'package:flutter/foundation.dart';

那么你可以使用kReleaseModelike

if(kReleaseMode){ // is Release Mode ??
    print('release mode');
} else {
    print('debug mode');
}
于 2019-04-10T08:45:19.100 回答
65

更新

请使用 Remi 的答案和kReleaseModekDebugMode或 Dart 编译将无法摇树你的代码


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

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

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

于 2018-04-07T15:52:31.743 回答
52

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

于 2018-04-07T13:19:36.533 回答
50

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 {

}
于 2020-06-21T18:24:45.983 回答
26

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

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

if(Foundation.kDebugMode) {
   print("App in debug mode");
}
于 2020-02-18T22:55:29.660 回答
8

这是找出应用程序在哪种模式下运行的两个步骤

  1. 添加以下导入以获取

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

    if(Foundation.kReleaseMode){ 
      print('app release mode');
    } else {
      print('App debug mode');
    }
    
于 2020-10-26T02:49:21.643 回答
8

我相信最新的方法是:

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

源代码

于 2020-09-13T21:18:33.287 回答
1

我创建了这个有用的类,基于其他答案并受到 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;

   }
于 2021-09-08T14:05:23.807 回答
0

摘自 Dart文档

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

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

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

于 2020-03-20T20:15:59.663 回答
0

制作一个名为 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");
于 2022-01-31T12:14:52.197 回答