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

如何在Dart中将字符串转换为自定义枚举类型?

解决Firestore字符串到不匹配枚举的转换问题

针对你遇到的Firestore中type字段字符串("one"/"two"/"three")与ValueType枚举(first/second/third)不匹配的转换需求,推荐以下几种实用方案:

方案一:使用映射表直接转换

定义字符串到枚举的映射常量,在模型构造函数中通过映射完成转换,适合简单场景:

// 定义字符串到枚举的映射
const Map<String, ValueType> _typeMap = {
  'one': ValueType.first,
  'two': ValueType.second,
  'three': ValueType.third,
};

// 修改Values.fromSnapshot构造函数
Values.fromSnapshot(DocumentSnapshot<Map<String, dynamic>> snapshot)
    : created = snapshot.data()!['created'],
      type = _typeMap[snapshot.data()!['type']] ?? ValueType.first, // 可选:设置默认值避免空值异常
      value = snapshot.data()!['value'].toDouble();

方案二:给枚举添加扩展方法(更优雅)

通过扩展方法给ValueType枚举增加字符串转换能力,代码复用性更强:

enum ValueType { first, second, third }

// 扩展枚举的转换方法
extension ValueTypeConverter on ValueType {
  static ValueType fromString(String typeStr) {
    switch (typeStr) {
      case 'one':
        return ValueType.first;
      case 'two':
        return ValueType.second;
      case 'three':
        return ValueType.third;
      default:
        // 业务需求可选:抛异常或返回默认值
        throw ArgumentError('无效的类型字符串: $typeStr');
        // return ValueType.first;
    }
  }
}

// 修改Values构造函数
Values.fromSnapshot(DocumentSnapshot<Map<String, dynamic>> snapshot)
    : created = snapshot.data()!['created'],
      type = ValueTypeConverter.fromString(snapshot.data()!['type']),
      value = snapshot.data()!['value'].toDouble();

方案三:支持双向转换(存/取场景)

如果需要将枚举转换为字符串存入Firestore,可以扩展双向转换方法:

enum ValueType { first, second, third }

extension ValueTypeExtension on ValueType {
  // 枚举转存储用的字符串
  String toStorageString() {
    switch (this) {
      case ValueType.first:
        return 'one';
      case ValueType.second:
        return 'two';
      case ValueType.third:
        return 'three';
    }
  }

  // 存储字符串转枚举
  static ValueType fromStorageString(String str) {
    switch (str) {
      case 'one':
        return ValueType.first;
      case 'two':
        return ValueType.second;
      case 'three':
        return ValueType.third;
      default:
        throw ArgumentError('不支持的类型字符串: $str');
    }
  }
}

// 存数据时使用
userCollection.doc(uid).collection('values').add({
  'created': DateTime.now(),
  'type': ValueType.first.toStorageString(),
  'value': 10.0,
});

// 取数据时使用
Values.fromSnapshot(DocumentSnapshot<Map<String, dynamic>> snapshot)
    : created = snapshot.data()!['created'],
      type = ValueTypeExtension.fromStorageString(snapshot.data()!['type']),
      value = snapshot.data()!['value'].toDouble();

注意事项

  • 务必处理无效字符串的情况:要么抛出异常提醒数据错误,要么返回默认枚举值,避免程序崩溃。
  • 如果后续新增枚举值,记得同步更新映射表或扩展方法中的转换逻辑。

内容的提问来源于stack exchange,提问作者desmeit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 18:34:53