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

Dart枚举如何实现无需实例化的通用服务UUID获取接口

解决方案

方案1:标记接口+静态成员直接实现

这是最贴合需求的轻量方案,既保留枚举的简洁性,又能实现静态服务UUID调用,同时通过标记接口做类型约束:

  1. 定义空抽象标记接口,统一约束所有GATT服务枚举:
abstract class GattService {}
  1. 每个服务枚举实现该接口,添加静态service getter(仅需一行重复代码):
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');
}
  1. 若需通用处理所有服务,可写顶层工具函数:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 01:07:34