Dart枚举如何实现无需实例化的通用服务UUID获取接口
解决方案
方案1:标记接口+静态成员直接实现
这是最贴合需求的轻量方案,既保留枚举的简洁性,又能实现静态服务UUID调用,同时通过标记接口做类型约束:
- 定义空抽象标记接口,统一约束所有GATT服务枚举:
abstract class GattService {}
- 每个服务枚举实现该接口,添加静态
servicegetter(仅需一行重复代码):
import 'package:uuid/uuid.dart'; enum Service1 implements GattService { char1('0000FFE1-0000-1000-8000-00805F9B34FB'), char2('0000FFE2-0000-1000-8000-00805F9B34FB'), char3('0000FFE3-0000-1000-8000-00805F9B34FB'); final String charId; const Service1(this.charId); Uuid get uuid => Uuid.parse(charId); // 直接通过Service1.service调用服务UUID static Uuid get service => Uuid.parse('0000FFE0-0000-1000-8000-00805F9B34FB'); } enum Service2 implements GattService { char1('0000FFB1-0000-1000-8000-00805F9B34FB'), char2('0000FFB2-0000-1000-8000-00805F9B34FB'); final String charId; const Service2(this.charId); // 修正原代码中的构造函数笔误 Uuid get uuid => Uuid.parse(charId); static Uuid get service => Uuid.parse('0000FFB0-0000-1000-8000-00805F9B34FB'); }
- 若需通用处理所有服务,可写顶层工具函数:
Uuid getServiceUuid<T extends GattService>() { switch (T) { case Service1: return Service1.service; case Service2: return Service2.service; default: throw ArgumentError('未定义的GATT服务类型:$T'); } } // 使用示例 void main() { print(getServiceUuid<Service1>()); print(Service2.service); }
方案2:代码生成(Dart 3.0+ 可选)
如果服务数量较多,可借助Dart 3.0+的宏特性自动生成静态service成员,进一步减少重复代码。只需定义宏扫描实现GattService的枚举,自动注入服务UUID静态成员即可。
为什么不选密封类?
密封类需要为每个服务单独创建类并手动维护特征列表,代码量远大于枚举,且会污染命名空间,完全不符合你追求简洁的需求。上述方案完美规避了这些问题,同时满足所有功能要求。
内容的提问来源于stack exchange,提问作者ultrapoci
相关产品推荐
相关产品推荐

