Flutter枚举字符串转换插件enum_string_extension的使用

Flutter 枚举字符串转换插件 enum_string_extension 的使用

概述

enum_string_extension 是一个 Dart 插件,它通过生成器为枚举类型生成扩展方法,从而方便地将枚举转换为字符串或从字符串转换为枚举。本文将详细介绍如何使用该插件,并提供一个完整的示例。

插件包

  • enum_string_extension: 提供枚举字符串扩展的方法。

  • enum_string_extension_gen: 生成器包,用于生成扩展方法。

完整示例

以下是详细的示例代码,展示如何使用 enum_string_extension 插件。

import 'dart:ui' show Locale;

import 'package:enum_string_extension/enum_string_extension.dart';
import 'package:flutter/cupertino.dart' show Localizations, BuildContext;
import 'package:json_annotation/json_annotation.dart';
import 'package:meta/meta.dart' show immutable;

part 'basic_class.g.dart';

// 定义本地化类
class AppLocalizations {
  AppLocalizations(this.locale) : labels = languages[locale];

  final Locale locale;
  static final Map<Locale, AppLocalizationsLabels> languages = {
    const Locale.fromSubtags(languageCode: 'en', countryCode: 'US'): const AppLocalizationsLabels(
      value1: 'Value 1 in english',
      value2: 'Value 2 in english',
      value3: 'Value 3 in english',
      testValue1: 'TestValue 1 in english',
      testValue2: 'TestValue 2 in english',
      test2Value1: 'Test2Value 1 in english',
      test2Value2: 'Test2Value 2 in english',
      myTestValue1: 'TestValue 1 in english',
      myTestValue2: 'TestValue 2 in english',
      mySecondTestValue1: 'TestValue 1 in english',
      mySecondTestValue2: 'TestValue 2 in english',
      myNamespace: AppLocalizations_Labels_myNamespace(
        value1: 'Value 1 in english',
        value2: 'Value 2 in english',
        value3: 'Value 3 in english',
        nameTestValue1: 'Value 1 in english',
        nameTestValue2: 'Value 2 in english',
        nameTestValue3: 'Value 3 in english',
      ),
    )
  };

  final AppLocalizationsLabels labels;

  static AppLocalizationsLabels of(BuildContext context) =>
      Localizations.of<AppLocalizations>(context, AppLocalizations)?.labels;
}

// 定义命名空间下的子类
class AppLocalizations_Labels_myNamespace {
  const AppLocalizations_Labels_myNamespace({
    this.value1,
    this.value2,
    this.value3,
    this.nameTestValue1,
    this.nameTestValue2,
    this.nameTestValue3,
  });

  final String value1;
  final String value2;
  final String value3;
  final String nameTestValue1;
  final String nameTestValue2;
  final String nameTestValue3;
}

// 定义本地化标签类
class AppLocalizationsLabels {
  const AppLocalizationsLabels({
    this.value1,
    this.value2,
    this.value3,
    this.testValue1,
    this.testValue2,
    this.test2Value1,
    this.test2Value2,
    this.myTestValue1,
    this.myTestValue2,
    this.mySecondTestValue1,
    this.mySecondTestValue2,
    this.variantValue5,
    this.variantValue6,
    this.myNamespace,
  });

  final String value1;
  final String value2;
  final String value3;
  final String testValue1;
  final String testValue2;
  final String test2Value1;
  final String test2Value2;
  final String myTestValue1;
  final String myTestValue2;
  final String mySecondTestValue1;
  final String mySecondTestValue2;
  final String variantValue5;
  final String variantValue6;
  final AppLocalizations_Labels_myNamespace myNamespace;
}

// 定义枚举类型
enum TestEnum4 {
  value1,
  value3,
}

enum TestEnum3 {
  value5,
  value6,
}

enum TestEnum2 {
  value1,
  value2,
  value3,
}

enum TestEnum6 {
  value1,
  value2,
  value3,
}

enum TestEnum {
  value1,
  value2,
}

// 使用 [@enumString](/user/enumString) 注解的类
[@immutable](/user/immutable)
[@enumString](/user/enumString)
class BasicClass {
  const BasicClass({
    this.test,
    this.test2,
    this.test3,
    this.test4,
    this.test5,
    this.test6,
    this.test7,
    this.test20,
    this.test21,
    this.test22,
    this.test23,
    this.test24,
    this.test25,
    this.test26,
  });

  // 生成 text() 方法
  final TestEnum test;

  // 生成 text() 方法
  final TestEnum2 test2;

  // 生成 variantText() 方法
  [@EnumKey](/user/EnumKey)(prefix: 'variant')
  final List<TestEnum3> test3;

  // 生成 myTestText() 方法
  [@JsonKey](/user/JsonKey)(ignore: true)
  [@EnumKey](/user/EnumKey)(prefix: 'myTest')
  [@EnumKey](/user/EnumKey)(prefix: 'mySecondTest')
  final TestEnum test4;

  // 生成 test2Text() 方法
  [@EnumKey](/user/EnumKey)(prefix: 'test2')
  final TestEnum test5;

  // 生成 myNamespace_text() 方法
  [@EnumKey](/user/EnumKey)(namespace: 'myNamespace')
  final TestEnum6 test6;

  // 生成 myNamespace_nameTestText() 方法
  [@EnumKey](/user/EnumKey)(namespace: 'myNamespace', prefix: 'nameTest')
  final TestEnum6 test7;

  // 不生成代码
  final TestEnum test20;

  // 重复前缀
  [@EnumKey](/user/EnumKey)(prefix: 'test')
  final TestEnum test21;

  [@EnumKey](/user/EnumKey)(prefix: 'Test')
  final TestEnum test22;

  // 非枚举字段
  final String test23;

  final List<String> test24;

  // 排除枚举
  [@EnumKey](/user/EnumKey)(exclude: true)
  final TestEnum4 test25;

  // 不生成 myNamespace_nameTestText() 方法
  [@EnumKey](/user/EnumKey)(prefix: 'nameTest')
  final TestEnum6 test26;
}

更多关于Flutter枚举字符串转换插件enum_string_extension的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter枚举字符串转换插件enum_string_extension的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


enum_string_extension 是一个用于在 Flutter 项目中方便地将枚举类型与字符串相互转换的插件。它通过代码生成的方式,为枚举类型自动生成扩展方法,使得你可以轻松地将枚举值转换为字符串,或者从字符串中解析出枚举值。

1. 安装插件

首先,你需要在 pubspec.yaml 文件中添加 enum_string_extension 依赖:

dependencies:
  flutter:
    sdk: flutter
  enum_string_extension: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 命令来获取依赖。

2. 定义枚举

在你的 Dart 文件中定义一个枚举类型,并使用 [@EnumToString](/user/EnumToString)() 注解:

import 'package:enum_string_extension/enum_string_extension.dart';

[@EnumToString](/user/EnumToString)()
enum Status {
  pending,
  approved,
  rejected,
}

3. 生成代码

运行以下命令来生成代码:

flutter pub run build_runner build

这将会生成一个扩展文件,通常会以 .g.dart 结尾,例如 status.g.dart

4. 使用生成的扩展方法

在生成的扩展文件中,你会看到类似以下的代码:

extension StatusExt on Status {
  String get stringValue {
    switch (this) {
      case Status.pending:
        return 'pending';
      case Status.approved:
        return 'approved';
      case Status.rejected:
        return 'rejected';
      default:
        throw Exception('Unknown enum value: $this');
    }
  }

  static Status fromString(String value) {
    switch (value) {
      case 'pending':
        return Status.pending;
      case 'approved':
        return Status.approved;
      case 'rejected':
        return Status.rejected;
      default:
        throw Exception('Unknown string value: $value');
    }
  }
}

现在你可以在你的代码中使用这些扩展方法:

void main() {
  Status status = Status.approved;

  // 将枚举转换为字符串
  String statusString = status.stringValue;
  print(statusString);  // 输出: approved

  // 从字符串中解析枚举
  Status parsedStatus = StatusExt.fromString('rejected');
  print(parsedStatus);  // 输出: Status.rejected
}

5. 自定义字符串映射

如果你希望枚举值映射到不同的字符串,可以通过 [@EnumToString](/user/EnumToString)() 注解的 values 参数来指定:

[@EnumToString](/user/EnumToString)(values: {
  Status.pending: '等待中',
  Status.approved: '已批准',
  Status.rejected: '已拒绝',
})
enum Status {
  pending,
  approved,
  rejected,
}
回到顶部