Flutter位枚举管理插件enum_bit_vector的使用
Flutter位枚举管理插件enum_bit_vector的使用
动机
通常情况下,我们需要存储一组标志或标签。例如超级英雄拥有的超能力、用户拥有的权限或者食品项的标签。所有这些用例都可以通过一组枚举值来表示:
enum SuperPowers { 隐形, 速度, 飞行, 永生, 抗性, 心灵感应 }
batman.SuperPowers = {SuperPowers.飞行, SuperPowers.抗性, SuperPowers.心灵感应};
enum Permissions { 删除文件, 邀请他人, 创建会议 }
user1.Permissions = { Permissions.邀请他人 };
enum FoodLabels { 素食, 纯素食, 含有坚果, 健酮友好 }
carrotLabels = {FoodLabels.纯素食, FoodLabels.素食, FoodLabels.健酮友好};
如果我们需要存储大量数据,那么将这些值以字符串列表或字符串到布尔值的映射形式存储在JSON中可能会效率低下:
{
"title": "胡萝卜",
"foodLabels": {
"FoodLabels.纯素食": true,
"FoodLabels.素食": true,
"FoodLabels.含有坚果": false,
"FoodLabels.健酮友好": true
}
}
相反,在Dart中我们可以使用一个64位整数来表示最多64个布尔值:只要我们的枚举包含的值不超过64个,我们就可以将它们全部放入一个整数中,该整数可以用只有8个字符的十六进制字符串表示。
安装
首先,你需要添加enum_bit_vector
包到你的项目中:
dart pub add enum_bit_vector
dart pub get
然后,导入这个包:
import 'package:enum_bit_vector/enum_bit_vector.dart';
如何使用
1. 注册你想要创建EnumBitVectors
的枚举类型
这一步只需要在程序运行期间执行一次,但必须在第一次使用该数据类型之前完成:
EnumBitVector.registerEnum(SuperPowers.values);
2. 从集合、列表、整数或十六进制字符串创建EnumBitVector
EnumBitVector enumBitVector;
// 从枚举集创建
enumBitVector = EnumBitVector.fromSet({SuperPowers.飞行, SuperPowers.抗性, SuperPowers.心灵感应});
// 从枚举列表创建
enumBitVector = EnumBitVector.fromList([SuperPowers.飞行, SuperPowers.抗性, SuperPowers.心灵感应]);
// 从整数创建
enumBitVector = EnumBitVector.fromInt(13);
// 从十六进制字符串创建
enumBitVector = EnumBitVector.fromHexString('0000000d');
访问值
你可以随时将EnumBitVector
转换为枚举集、枚举列表、整数或十六进制字符串:
enumBitVector.toSet(); // => {SuperPowers.飞行, SuperPowers.抗性, SuperPowers.心灵感应}
enumBitVector.enumSet; // => {SuperPowers.飞行, SuperPowers.抗性, SuperPowers.心灵感应}
enumBitVector.toList(); // => [SuperPowers.飞行, SuperPowers.抗性, SuperPowers.心灵感应]
enumBitVector.toInt(); // => 13
enumBitVector.value; // => 13
enumBitVector.toBinaryString(); // => '0000000000000000000000000000000000000000000000000000000000001101'
enumBitVector.toHexString(); // => '0000000d';
JSON转换
final json = enumBitVector.toJson();
// json 将是 {'v': 13}
final bitVector = EnumBitVector<SuperPowers>.fromJson({'v': 13});
// 将创建一个值为13的bit vector。
打印EnumBitVector
enumBitVector = EnumBitVector.fromSet({SuperPowers.飞行, SuperPowers.抗性, SuperPowers.心灵感应});
print(enumBitVector);
// 打印: EnumBitVector<SuperPowers>(0000000000000000000000000000000000000000000000000000000000001101 = {SuperPowers.飞行, SuperPowers.抗性, SuperPowers.心灵感应})
完整示例Demo
以下是一个完整的示例代码,展示了如何使用enum_bit_vector
插件:
import 'package:enum_bit_vector/enum_bit_vector.dart';
enum SuperPowers { 隐形, 速度, 飞行, 永生, 抗性, 心灵感应 }
void main(List<String> arguments) {
// 注册枚举类型
EnumBitVector.registerEnum(SuperPowers.values);
// 创建一个枚举集合
final enumSet = {
SuperPowers.飞行,
SuperPowers.抗性,
SuperPowers.心灵感应,
};
// 输出原始枚举集合
print('枚举集合: $enumSet');
// 从枚举集合创建EnumBitVector
final enumBitVector = EnumBitVector.fromSet(enumSet);
// 输出EnumBitVector
print('EnumBitVector: $enumBitVector');
// 输出EnumBitVector转换为整数
print('EnumBitVector转为整数: ${enumBitVector.toInt()}');
// 输出EnumBitVector转换为集合
print('EnumBitVector转为集合: ${enumBitVector.toSet()}');
// 输出EnumBitVector转换为列表
print('EnumBitVector转为列表: ${enumBitVector.toList()}');
}
更多关于Flutter位枚举管理插件enum_bit_vector的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter位枚举管理插件enum_bit_vector的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
enum_bit_vector
是一个用于管理位枚举的 Flutter 插件,允许你在单个整数中存储和管理多个枚举值。位枚举是一种高效的方式,可以将多个布尔值或枚举值压缩到一个整数中,通常用于需要高效存储和操作多个标志位的场景。
安装
首先,你需要在 pubspec.yaml
文件中添加 enum_bit_vector
依赖:
dependencies:
flutter:
sdk: flutter
enum_bit_vector: ^1.0.0 # 请查看最新版本
然后运行 flutter pub get
来安装依赖。
使用方法
1. 创建一个枚举
首先,你需要定义一个枚举类型。例如:
enum MyFlags {
flag1,
flag2,
flag3,
flag4,
}
2. 创建一个 EnumBitVector 实例
使用 EnumBitVector
来管理你的枚举值。你可以通过 EnumBitVector.fromEnumList
或 EnumBitVector.empty
创建一个实例。
import 'package:enum_bit_vector/enum_bit_vector.dart';
void main() {
// 创建一个空的 EnumBitVector
var bitVector = EnumBitVector<MyFlags>.empty();
// 设置某个位
bitVector.set(MyFlags.flag1);
bitVector.set(MyFlags.flag3);
// 检查某个位是否被设置
print(bitVector.isSet(MyFlags.flag1)); // 输出: true
print(bitVector.isSet(MyFlags.flag2)); // 输出: false
// 清除某个位
bitVector.clear(MyFlags.flag1);
print(bitVector.isSet(MyFlags.flag1)); // 输出: false
// 从枚举列表创建 EnumBitVector
var bitVectorFromList = EnumBitVector.fromEnumList([MyFlags.flag2, MyFlags.flag4]);
print(bitVectorFromList.isSet(MyFlags.flag2)); // 输出: true
print(bitVectorFromList.isSet(MyFlags.flag3)); // 输出: false
}
3. 操作 EnumBitVector
EnumBitVector
提供了多种方法来操作位向量:
set(MyFlags flag)
: 设置某个位。clear(MyFlags flag)
: 清除某个位。isSet(MyFlags flag)
: 检查某个位是否被设置。toggle(MyFlags flag)
: 切换某个位的状态。toList()
: 将位向量转换为枚举列表。toInt()
: 获取位向量的整数值。
4. 位运算
你可以直接对 EnumBitVector
进行位运算(如 &
, |
, ^
, ~
等),因为它们内部使用整数存储位信息。
var vector1 = EnumBitVector.fromEnumList([MyFlags.flag1, MyFlags.flag2]);
var vector2 = EnumBitVector.fromEnumList([MyFlags.flag2, MyFlags.flag3]);
// 位或运算
var orVector = vector1 | vector2;
print(orVector.toList()); // 输出: [MyFlags.flag1, MyFlags.flag2, MyFlags.flag3]
// 位与运算
var andVector = vector1 & vector2;
print(andVector.toList()); // 输出: [MyFlags.flag2]