Dart明确区分了错误(表示代码逻辑中存在问题且永远不会发生且永远不会被捕获)和异常(表示基于运行时数据的问题).

我真的很喜欢这种区别,但我想知道什么时候我应该使用assert()个函数?

推荐答案

断言是一种只在开发中执行有用代码的方法,而不妨碍发布模式的性能——通常是为了防止类型系统中缺少功能导致的不良状态.

例如,只有断言可以用于进行防御性编程and提供常量构造函数.

我们可以做到:

class Foo {
  const Foo(): assert(false);
}

但我做不到:

class Foo {
  const Foo() { throw 42; }
}

同样,一些理智判断的费用也相对较高.

例如,在FLUTH上下文中,您可能希望遍历小部件树以判断小部件的祖先.但这是昂贵的,因为只有对开发人员有用的东西.

在断言中执行该判断既可以实现发布的性能,也可以实现开发中的实用程序.

assert(someVeryExpensiveCheck());

Flutter相关问答推荐

为什么当我升级时我的项目没有运行

在Flutter中,有没有一种方法可以点击页面到后面的页面?

如何创建一个按钮来在Ffltter Webview中转到上一页?

如何让一个名为ONTAP的回调函数、另一个名为onTapDown的回调函数和另一个名为onTapUp的回调函数不重叠?

Flutter 中的面向对象模式

Flutter 蜂窝单元测试

将图标呈现在Flutter 克牌小工具的角落上

如何实现Flutter 梳理机图像的小量移动

有没有可能不在BlocBuilder中重新构建内容?

在Dart中使用Riverpod代码生成时出现问题(addListener)

Flutter中不使用Container是否可以做margin

如何拥有 StreamProvider 的多个侦听器,其中稍后添加的侦听器接收最新数据?

运行任何 flutter 命令都会显示无法安装 <版本>

Riverpod 注册多少个 providers

Flutter屏幕适配 - 在模拟器和真实手机上文本尺寸不同

允许文本小部件在容器之间溢出

MediaQuery 在不同手机上不一致

我们什么时候在flutter中初始化一个provider?

Flutter ListView builder 未使用新数据更新

在 Flutter 中更新对象实例属性的最佳实践是什么?该实例嵌套在提供程序类的映射中,如下所示