假设我有简单的记录器:
void main() {
var logger = new MyLogger();
logger.log("hello Dart");
}
我希望此代码在开发模式(VM 检查模式)下运行,但我不希望它在我的生产代码中。我希望它被 dart2js 编译器“摇动”掉。有一些标准的方法吗?
您可以将代码嵌入到assert
. 断言在生产代码中被忽略,我确定在模式下pub build
运行时不会构建到 JS。release
class X {
X() {
print('x created');
}
void log(String m) {
print(m);
}
}
bool log(String m) {
new X()..log(m);
return true;
}
void main() {
assert(() {
new X()..log('in Assert');
return true;
});
assert(() => log('in Assert')); // use a wrapper function
}
当您创建一个返回的包装器方法时,true
您不必每次都显式地执行它。
您也可以看看这个问题如何实现类似功能的预编译器指令
我将@GünterZöchbauer“断言技巧”放在工厂构造函数中:
class _ProductionPlug implements DebugClass{
const _ProductionPlug();
noSuchMethod(_) {} //do nothing
}
class DebugClass{
static final DebugClass _plug = const _ProductionPlug();
log(msg){print(msg);}
DebugClass._(){}
factory DebugClass(){
DebugClass instance;
assert((){
instance = new DebugClass._();
return true;
});
return instance != null ? instance : _plug;
}
}
void main() {
print("hello");
new DebugClass()
..log("debugging");
}
这样就没有什么突出的了。