Flutter增强枚举处理插件enhanced_enum的使用
Flutter增强枚举处理插件enhanced_enum的使用
enhanced_enum
是一个用于生成枚举扩展和从字符串生成枚举的生成器。它可以帮助你在 Flutter 项目中更方便地处理枚举类型。
安装与构建
-
将
enhanced_enum
包添加到你的项目中,并将enhanced_enum_generator
包作为开发依赖添加:pub add enhanced_enum && pub add enhanced_enum_generator --dev
-
在你想要使用
enhanced_enum
的文件中引入包:import 'package:enhanced_enum/enhanced_enum.dart';
-
添加生成文件的部分声明:
part 'YOURFILE.g.dart';
例如:
part 'main.g.dart';
-
在你的枚举上添加
@enhancedEnum
装饰器,或者使用[@EnhancedEnum](/user/EnhancedEnum)()
来设置更多选项:[@EnhancedEnum](/user/EnhancedEnum)(strict: false, namingConvention: EnhancedEnumNamingConvention.snakeCase) enum Animals { fox, rabbit, redPanda }
-
使用
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
更多关于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
插件允许你为你的枚举类型添加更多功能和数据,使它们更加灵活和有用。