Flutter增强枚举处理插件enhanced_enum的使用

发布于 1周前 作者 itying888 来自 Flutter

Flutter增强枚举处理插件enhanced_enum的使用

enhanced_enum 是一个用于生成枚举扩展和从字符串生成枚举的生成器。它可以帮助你在 Flutter 项目中更方便地处理枚举类型。

安装与构建

  1. enhanced_enum 包添加到你的项目中,并将 enhanced_enum_generator 包作为开发依赖添加:

    pub add enhanced_enum && pub add enhanced_enum_generator --dev
    
  2. 在你想要使用 enhanced_enum 的文件中引入包:

    import 'package:enhanced_enum/enhanced_enum.dart';
    
  3. 添加生成文件的部分声明:

    part 'YOURFILE.g.dart';
    

    例如:

    part 'main.g.dart';
    
  4. 在你的枚举上添加 @enhancedEnum 装饰器,或者使用 [@EnhancedEnum](/user/EnhancedEnum)() 来设置更多选项:

    [@EnhancedEnum](/user/EnhancedEnum)(strict: false, namingConvention: EnhancedEnumNamingConvention.snakeCase)
    enum Animals { fox, rabbit, redPanda }
    
  5. 使用 build_runner 构建增强的枚举:

    pub run build_runner build
    

使用示例

定义枚举

import 'package:enhanced_enum/enhanced_enum.dart';

part 'main.g.dart';

[@EnhancedEnum](/user/EnhancedEnum)(strict: false, namingConvention: EnhancedEnumNamingConvention.snakeCase)
enum Animals { fox, rabbit, redPanda }

[@EnhancedEnum](/user/EnhancedEnum)()
enum AnimalParts {
  @EnhancedEnumValue(name: 'cutsie paw')
  paw,
  @EnhancedEnumValue(name: 'curly tail')
  tail,
  @EnhancedEnumValue(name: 'boopable snoot')
  snoot,
}

[@EnhancedEnum](/user/EnhancedEnum)(namingConvention: EnhancedEnumNamingConvention.snakeCase)
enum AnimalColours {
  redYellow, greenBlack,
}

[@EnhancedEnum](/user/EnhancedEnum)(prefixes: ['water-', 'fire_'])
enum AnimalTypes {
  @EnhancedEnumValue(name: 'bird')
  bird
}

使用枚举

void main() {
  print(Animals.values.fromString('fox')); // 输出: Animals.fox
  print(Animals.values.fromString('red_panda')); // 输出: Animals.redPanda
  print(Animals.values.fromString('redPanda')); // 输出: Animals.redPanda
  print(Animals.values.fromString('Animals.rabbit')); // 输出: Animals.rabbit
  print(AnimalParts.values.fromString('boopable snoot')); // 输出: AnimalParts.snoot
  print(AnimalColours.values.fromString('red_yellow')); // 输出: AnimalColours.redYellow
  print(AnimalColours.values.fromString('redYellow')); // 输出: null (因为默认是严格模式)
  print(AnimalTypes.values.fromString('water-bird')); // 输出: AnimalTypes.bird
  print(AnimalTypes.values.fromString('fire_bird')); // 输出: AnimalTypes.bird

  print(Animals.redPanda.name); // 输出: red_panda
  print(AnimalParts.paw.name); // 输出: cutsie paw

  print(Animals.fox.isFox); // 输出: true
  print(Animals.fox.isRedPadna); // 输出: false

  print(Animals.fox.when(
    fox: () => 1,
    rabbit: () => 2,
    redPanda: () => 3,
  )); // 输出: 1

  print(Animals.fox.maybeWhen(
    rabbit: () => 2,
    orElse: () => 9001,
  )); // 输出: 9001

  print(Animals.rabbit.maybeWhen(
    rabbit: () => 2,
    orElse: () => 9001,
  )); // 输出: 2
}

枚举值的命名

如果你有一个名为 MyEnum 的枚举,那么 MyEnum.values.fromString() 会根据值的名称生成相应的枚举。同样,MyEnum.someVal.name 会返回枚举值的名称。

有时,代码中的枚举名称与你希望的字符串表示形式不一致。例如,你在代码中使用 camelCase,但枚举代表的值在 JSON 中使用 snake_case。为此,EnhancedEnum() 构造函数接受一个 namingConvention 参数,可以根据命名约定命名枚举。可用的命名约定有:

  • EnhancedEnumNamingConvention.original:源代码中的枚举值名称不变
  • EnhancedEnumNamingConvention.camelCase:camelCase 命名约定
  • EnhancedEnumNamingConvention.upperCamelCase:UpperCamelCase 命名约定(与 camelCase 相同,只是首字符大写)
  • EnhancedEnumNamingConvention.snakeCase:snake_case 命名约定
  • EnhancedEnumNamingConvention.screamingSnakeCase:SCREAMING_SNAKE_CASE 命名约定(与 snake_case 相同,只是所有字符大写)

有时你的枚举值名称过于复杂,无法很好地映射到这些命名约定。为此,你可以使用 EnhancedEnumValue() 注解为特定值提供名称覆盖。例如:

[@EnhancedEnum](/user/EnhancedEnum)()
enum AnimalParts {
  @EnhancedEnumValue(name: 'cutsie paw')
  paw,
  @EnhancedEnumValue(name: 'curly tail')
  tail,
  @EnhancedEnumValue(name: 'boopable snoot')
  snoot,
}

严格枚举

如果枚举设置为严格模式(strict: true),则在从字符串转换为枚举值时,必须使用确切的枚举名称字符串表示形式。例如:

[@EnhancedEnum](/user/EnhancedEnum)(strict: true)
enum AnimalColours {
  redYellow, greenBlack,
}

在这种情况下,AnimalColours.values.fromString('redYellow') 将返回 null,因为严格模式要求精确匹配。


更多关于Flutter增强枚举处理插件enhanced_enum的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter增强枚举处理插件enhanced_enum的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,enhanced_enum 是一个用于增强 Flutter 中枚举处理能力的插件。它允许你为枚举类型添加额外的数据和方法,从而使枚举更加灵活和强大。以下是一个使用 enhanced_enum 的代码示例,展示了如何定义和使用增强枚举。

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

dependencies:
  flutter:
    sdk: flutter
  enhanced_enum: ^x.y.z  # 替换为最新版本号

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

接下来,定义一个增强枚举。假设我们有一个表示星期几的枚举,并且我们想为每个星期几添加一个表示该天缩写的字符串:

import 'package:enhanced_enum/enhanced_enum.dart';

part 'day_of_week.g.dart';

@EnhancedEnum()
class DayOfWeek extends _$DayOfWeek {
  const DayOfWeek._(String name, this.abbreviation) : super(name);

  final String abbreviation;

  static const monday = DayOfWeek._('monday', 'Mon');
  static const tuesday = DayOfWeek._('tuesday', 'Tue');
  static const wednesday = DayOfWeek._('wednesday', 'Wed');
  static const thursday = DayOfWeek._('thursday', 'Thu');
  static const friday = DayOfWeek._('friday', 'Fri');
  static const saturday = DayOfWeek._('saturday', 'Sat');
  static const sunday = DayOfWeek._('sunday', 'Sun');

  // 可以添加更多方法或属性
  String get fullDayName {
    switch (this) {
      case DayOfWeek.monday:
        return 'Monday';
      case DayOfWeek.tuesday:
        return 'Tuesday';
      case DayOfWeek.wednesday:
        return 'Wednesday';
      case DayOfWeek.thursday:
        return 'Thursday';
      case DayOfWeek.friday:
        return 'Friday';
      case DayOfWeek.saturday:
        return 'Saturday';
      case DayOfWeek.sunday:
        return 'Sunday';
    }
  }
}

注意,我们使用了 @EnhancedEnum() 注解,并且创建了一个伴随文件 day_of_week.g.dart(这个文件将自动生成,用于包含枚举的辅助代码)。在上面的代码中,我们还为每个枚举值添加了一个缩写,并定义了一个 fullDayName 方法来获取完整的星期几名称。

要生成 day_of_week.g.dart 文件,你需要运行构建生成器。这通常是通过在命令行中运行以下命令来完成的:

flutter pub run build_runner build

现在你可以在你的 Flutter 应用中使用这个增强枚举了:

import 'package:flutter/material.dart';
import 'day_of_week.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Enhanced Enum Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: DayOfWeek.values.map((day) {
              return Text(
                '${day.fullDayName} (${day.abbreviation})',
                style: TextStyle(fontSize: 20),
              );
            }).toList(),
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的 Flutter 应用,它在屏幕上显示每个星期几的完整名称和缩写。

通过这种方式,enhanced_enum 插件允许你为你的枚举类型添加更多功能和数据,使它们更加灵活和有用。

回到顶部