Dart与Flutter中set/get作用 附AppScrollBehavior代码解析
Dart/Flutter 中
get与set关键字作用说明 基础功能定义
get:用于定义类的getter(读属性),属于计算属性的一种实现:
定义后外部访问该属性时不需要加方法调用括号,和访问普通成员变量写法完全一致,适合封装属性读取时的自定义逻辑,不需要额外暴露内部实现细节。getter不接收任何入参,有明确的返回值类型。set:用于定义类的setter(写属性),和getter成对出现:
定义后外部给该属性赋值时会自动触发set内的自定义逻辑,接收一个和属性类型匹配的入参,适合做赋值前的参数校验、赋值后的状态联动更新等场景,调用时和给普通变量赋值写法一致。
对应示例代码解析
你提供的代码是Flutter中自定义全局滚动行为的常见实现,代码如下:
class AppScrollBehavior extends MaterialScrollBehavior { @override Set<PointerDeviceKind> get dragDevices => { PointerDeviceKind.touch, PointerDeviceKind.mouse, }; }
- 这段代码仅使用了
get关键字,作用是重写父类MaterialScrollBehavior的dragDevicesgetter:
Flutter父类默认实现的dragDevices仅包含触控屏(PointerDeviceKind.touch)类型的指针,桌面端默认鼠标拖动不会触发滚动组件的拖拽惯性效果。这里重写getter后,返回的设备集合同时包含触控屏、鼠标两类指针,最终实现桌面端鼠标拖拽滚动组件也能触发正常滚动的效果。 - 这段代码没有使用
set关键字:该场景只需要自定义属性读取时的返回值,不需要修改该属性的写入逻辑,因此无需实现对应的setter。
set 用法参考示例
由于示例代码未涉及set实现,这里给出一个最常见的set使用场景参考:
class Profile { // 私有存储变量,不对外直接暴露 int _phoneNum = 0; // 读取手机号时直接返回内部存储值 int get phoneNum => _phoneNum; // 给手机号赋值时自动做格式校验 set phoneNum(int value) { if (value.toString().length != 11) { throw ArgumentError('手机号必须为11位数字'); } _phoneNum = value; } } void main() { final profile = Profile(); profile.phoneNum = 13800138000; // 触发set逻辑,校验通过后完成赋值 print(profile.phoneNum); // 触发get逻辑,读取到存储的手机号 }
内容的提问来源于stack exchange,提问作者Faranack
相关产品推荐
相关产品推荐

