如何检查 Flutter 应用程序是否处于 运行 调试状态?
How can I check if a Flutter application is running in debug?
我正在寻找一种在应用程序处于调试模式时在 Flutter 中执行代码的方法。这在 Flutter 中可能吗?我似乎无法在文档中的任何地方找到它。
像这样
If(app.inDebugMode) {
print("Print only in debug mode");
}
如何检查 Flutter 应用程序 运行 处于调试模式还是发布模式?
虽然这可行,但最好使用常量 kReleaseMode
或 kDebugMode
。请参阅下面的 以获得完整的解释,这应该是公认的问题。
最简单的方法是使用 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 只能对布尔值进行运算,因此仅传入函数是行不通的。
请将 与 kReleaseMode
和 kDebugMode
一起使用,否则 Dart 编译将无法 tree-shake 您的代码。
这个小片段应该可以满足您的需求:
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');
}
在以后的版本中,可以使用kDebugMode
:
if (kDebugMode)
doSomething();
虽然断言在技术上可用于手动创建“调试模式”变量,但您应该避免这种情况。
而是使用 package:flutter/foundation.dart
中的常量 kReleaseMode
不同之处在于 tree shaking。
Tree shaking(又名编译器删除未使用的代码)取决于变量是常量。
问题是,断言我们的 isInReleaseMode
布尔值 不是 常量。因此,在发布我们的应用程序时,开发代码和发布代码都包含在内。
另一方面,kReleaseMode
是一个常数。因此编译器能够正确地删除未使用的代码,我们可以安全地这样做:
if (kReleaseMode) {
} else {
// Will be tree-shaked on release builds.
}
不要挑剔,但基础包包含一个 kDebugMode
常量。
所以:
import 'package:flutter/foundation.dart' as Foundation;
if(Foundation.kDebugMode) {
print("App in debug mode");
}
从 Dart 中提取 Documentation:
When exactly do assertions work? That depends on the tools and
framework you’re using:
- Flutter enables assertions in debug mode.
- Development-only tools such as dartdevc typically enable assertions by default.
- Some tools, such as dart and dart2js, support assertions through a command-line flag: --enable-asserts.
In production code, assertions are ignored, and the arguments to
assert aren’t evaluated.
kDebugMode
您现在可以使用 kDebugMode
constant。
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 {
}
我相信最新的方法是:
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');
}
我根据其他答案和 Android 用法的启发创建了这个有用的 class。
如果“Foundation”包发生任何变化,则无需更改整个应用程序,只需更改此 class.
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");
我正在寻找一种在应用程序处于调试模式时在 Flutter 中执行代码的方法。这在 Flutter 中可能吗?我似乎无法在文档中的任何地方找到它。
像这样
If(app.inDebugMode) {
print("Print only in debug mode");
}
如何检查 Flutter 应用程序 运行 处于调试模式还是发布模式?
虽然这可行,但最好使用常量 kReleaseMode
或 kDebugMode
。请参阅下面的
最简单的方法是使用 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 只能对布尔值进行运算,因此仅传入函数是行不通的。
请将 kReleaseMode
和 kDebugMode
一起使用,否则 Dart 编译将无法 tree-shake 您的代码。
这个小片段应该可以满足您的需求:
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');
}
在以后的版本中,可以使用kDebugMode
:
if (kDebugMode)
doSomething();
虽然断言在技术上可用于手动创建“调试模式”变量,但您应该避免这种情况。
而是使用 package:flutter/foundation.dart
kReleaseMode
不同之处在于 tree shaking。
Tree shaking(又名编译器删除未使用的代码)取决于变量是常量。
问题是,断言我们的 isInReleaseMode
布尔值 不是 常量。因此,在发布我们的应用程序时,开发代码和发布代码都包含在内。
另一方面,kReleaseMode
是一个常数。因此编译器能够正确地删除未使用的代码,我们可以安全地这样做:
if (kReleaseMode) {
} else {
// Will be tree-shaked on release builds.
}
不要挑剔,但基础包包含一个 kDebugMode
常量。
所以:
import 'package:flutter/foundation.dart' as Foundation;
if(Foundation.kDebugMode) {
print("App in debug mode");
}
从 Dart 中提取 Documentation:
When exactly do assertions work? That depends on the tools and framework you’re using:
- Flutter enables assertions in debug mode.
- Development-only tools such as dartdevc typically enable assertions by default.
- Some tools, such as dart and dart2js, support assertions through a command-line flag: --enable-asserts.
In production code, assertions are ignored, and the arguments to assert aren’t evaluated.
kDebugMode
您现在可以使用 kDebugMode
constant。
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 {
}
我相信最新的方法是:
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'); }
我根据其他答案和 Android 用法的启发创建了这个有用的 class。 如果“Foundation”包发生任何变化,则无需更改整个应用程序,只需更改此 class.
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");