我正在寻找一种在应用程序处于调试模式时在 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的答案kReleaseMode
和kDebugMode
否则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 {
}
虽然这有效,但最好使用常量kReleaseMode
或kDebugMode
。有关完整的解释,请参阅下面的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的基础库。你可以得到debug
,profile
和release
import 'package:flutter/foundation.dart';
然后
if (kDebugMode) {
// debug code
}
if (kProfileMode) {
// profile code
}
if (kReleaseMode) {
// release code
}
摘自Dart文档:
断言究竟什么时候起作用?这取决于工具和 您正在使用的框架:
- Flutter 在调试模式下启用断言。
- 仅开发工具(如 dartdevc(通常默认启用断言。
- 一些工具,如 dart 和 dart2js,支持通过命令行标志的断言:--enable-asserts。
在生产代码中,断言被忽略,参数 不评估断言。