Dart中assert的用法解析及断言无差异问题咨询
关于Dart中assert断言不生效的问题解答
嘿,这个问题我当初刚学Dart的时候也踩过坑!核心原因其实是Dart的断言默认只在开发/调试模式下生效,生产模式会直接跳过断言代码,所以你不管写assert(false)还是assert(true),默认运行时结果都一样~
为什么你的代码没触发断言?
Dart有两种核心运行模式:
- 开发模式(Debug/Checked Mode):启用断言、类型检查等调试相关功能,帮助开发者提前发现问题。
- 生产模式(Release Mode):关闭所有调试相关代码,追求性能最优,断言会被完全忽略。
你直接用dart your_file.dart运行代码时,默认是生产模式,所以构造函数里的assert(false)根本不会执行,super(name: name)正常运行,自然会打印出Jason。
怎么让断言生效?
想要看到断言的效果,运行代码时需要加上--enable-asserts参数,比如:
dart --enable-asserts your_file.dart
这时候再运行你的代码,assert(false)就会触发AssertionError,程序会直接崩溃,不会执行后续的super构造,也就不会打印Jason了。
再说说断言的正确用法
断言的设计初衷就是在开发阶段做前置条件检查,比如你看到的ModelBinding里的assert(initialModel != null):
ModelBinding({ Key key, this.initialModel = const GalleryOptions(), this.child, }) : assert(initialModel != null), super(key: key);
它的作用是确保开发者在初始化这个Widget时,initialModel不为空——调试阶段如果传了null,会立刻报错提醒;而到了生产模式,这段断言代码会被移除,不会影响App性能。
如果你用Flutter开发的话,Debug模式默认是启用断言的,Release模式自动关闭,所以在Flutter里写的断言,调试时会正常生效,发布后不会有额外性能开销。
内容的提问来源于stack exchange,提问作者Micheal Shawn
相关产品推荐
相关产品推荐

