Flutter枚举字符串转换插件enum_string_extension的使用
Flutter 枚举字符串转换插件 enum_string_extension
的使用
概述
enum_string_extension
是一个 Dart 插件,它通过生成器为枚举类型生成扩展方法,从而方便地将枚举转换为字符串或从字符串转换为枚举。本文将详细介绍如何使用该插件,并提供一个完整的示例。
插件包
完整示例
以下是详细的示例代码,展示如何使用 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
更多关于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,
}