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

1 回复

更多关于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.fromEnumListEnumBitVector.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]
回到顶部