Dart中构造函数传入Lambda与普通参数的差异及适用场景
Dart构造函数的两种写法差异解析
先明确两种写法的核心代码:
写法一:传入Lambda(函数类型参数)
class A { A(this.attr); final String Function() attr; } void main() { final myStringAttr = 'some-string'; final a = A(()=> myStringAttr); // 获取值时需要调用函数:a.attr() }
写法二:传入普通值(String类型参数)
class A { A(this.attr); final String attr; } void main() { final myStringAttr = 'some-string'; final a = A(myStringAttr); // 获取值直接访问:a.attr }
一、两种写法的核心差异
这两种写法的本质是存储的内容完全不同:
- 写法一的
attr是一个函数对象,存储的是一段可执行的逻辑,每次需要值的时候必须调用attr()才能拿到结果; - 写法二的
attr是一个固定的String值,初始化后就不会改变,直接访问就能拿到结果。
举个直观的例子,如果把myStringAttr改成可变变量:
void main() { var myStringAttr = 'some-string'; final a1 = A(()=> myStringAttr); final a2 = A(myStringAttr); myStringAttr = 'new-string'; print(a1.attr()); // 输出:new-string print(a2.attr); // 输出:some-string }
这就能明显看出差异:写法一每次调用都会获取变量的最新值,写法二则只保留初始化时的固定值。
二、传入Lambda和普通构造函数的区别
构造函数本身的语法差异很小,核心区别在于参数的类型和用途:
- 普通构造函数接收的是具体的值,类初始化时就确定了属性的最终内容;
- 传入Lambda的构造函数接收的是一段逻辑,类可以在任意时机执行这段逻辑来获取值,相当于把“获取值的逻辑”委托给了外部。
三、Lambda写法的性能问题
性能差异非常微小,只有在极端场景下才会显现:
- 函数调用会比直接访问变量多一层开销,但单次调用的耗时可以忽略,只有当
attr()被百万次以上高频调用时,才会有微弱的性能差距; - Lambda作为闭包会捕获外部变量,会比直接存储String多占用少量内存,但普通业务场景下完全不会影响程序运行。
四、何时使用Lambda写法
适合以下几种场景:
- 延迟计算:获取值的过程比较耗时(比如读取本地文件、计算复杂结果),不想在类初始化时就执行,而是等到需要用的时候再触发;
- 动态更新值:需要每次获取值时都拿到最新的结果,比如返回当前时间、依赖外部可变状态的数值;
- 逻辑委托:需要把一段自定义逻辑传给类,让类在特定时机执行,比如自定义组件的回调、配置动态生成规则。
内容的提问来源于stack exchange,提问作者Carlos Daniel
相关产品推荐
相关产品推荐

