You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的dragDevices getter:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 21:18:22