Flutter插件bare的介绍与使用

Flutter插件bare的介绍与使用

Binary Application Record Encoding (二进制应用程序记录编码)

BARE 是为 Dart 开发者提供的一个库。BARE 是一种用于结构化应用程序数据的简单二进制表示方法。https://baremessages.org/ 它是 protobuf、msgpack、JSON、BSON 等的替代方案。 此仓库提供了一个用于二进制应用程序记录编码的序列化/反序列化包。

关于BARE

BARE 是一种针对小消息量和实现简单化的消息协议。它的轻量级协议允许你构建明确的架构,并通过可选的代码生成,你可以在广泛的编程环境中获得兼容性和类型安全。BARE 还强调了消息的向后兼容性,今天编码的消息在明天也可以解码,而不会牺牲扩展性。 目前,已经有针对 Lisp、D、.NET、Elm、Erlang、Go、Java、JavaScript、OCaml、PHP、Python、Ruby、Rust 等语言的实现。

为什么选择BARE消息

在众多的消息协议中,有几种被广泛采用的标准供选择。在谷歌protobuf、JSON、BSON、MessagePack等之间的选择是一个权衡问题。JSON 对人和机器都是可读的,但消息比较臃肿。Protobuf 优化了这一点,但又过于脆弱且复杂。BSON 将MongoDB的实现细节泄露到了规范中…… 详细报告请参阅 BARE 创建者 Drew DeVault 的原始博客文章:Introducing the BARE messaging encoding

BARE 是你的选择,如果你希望优化以下方面:

  • 小消息量
  • 标准化
  • 实现简单
  • 普适性实现,几乎不需要扩展
  • 简单性——没有不贡献核心任务的多余内容

bare.dart 特点

Dart 实现的 BARE 消息完全支持 BARE 的 IETF 互联网草案:draft-devault-bare-03

  • 优化小消息量:二进制,非自描述,无对齐或填充
  • 标准化且简单:规范只有大约1000个单词
  • 普适性:扩展不需要扩展实现,也不需要与旧实现不兼容的消息
  • 零依赖
  • 解析 BARE 架构
  • 生成 BARE 架构类型的编码/解码方法
  • 支持深度嵌套的匿名结构和联合

要更深入地了解 BARE 的基础知识,请参阅官方文档。

BARE 代码生成器

代码生成器将所有 *.bare 文件转换为:

  • *.dart
  • *.bare.dart

它生成必要的类和扩展方法。

运行代码生成器:

$ dart run build_runner build

编码类的方法:

<class_name>.toBare

解码到类的方法:

<class_name>.fromBare(bytes)

查看示例文件夹以获取架构文件样本和生成的代码。

代码生成器配置选项

to_string - 为生成的类生成 toString 覆盖。默认 - True

targets:
  $default:
    builders:
      bare_codegen|bareGenerator:
        options:
          to_string: True

运行项目

更新依赖项:

$ cd bare && pub get
$ cd bare_codegen && pub get
$ cd example && pub get

进入 example 目录并运行构建过程和测试:

$ dart run build_runner build
$ dart test

示例 BARE 架构

type PublicKey data[128]
type Time str # ISO 8601

type Department enum {
  ACCOUNTING
  ADMINISTRATION
  CUSTOMER_SERVICE
  DEVELOPMENT

  # 保留给CEO
  JSMITH = 99
}

type Customer struct {
  name: str
  email: str
  address: Address
  orders: list<struct {
    orderId: i64
    quantity: i32
  }>
  metadata: map<str><data>
}

生成的类

(完整的文件请参见示例文件夹)

class Customer {
  String name;
  String email;
  Address address;
  List<Orders1> orders;
  Map<String, List<int>> metadata;
  Customer(
      {required this.name,
      required this.email,
      required this.address,
      required this.orders,
      required this.metadata});

  static Customer fromBare(data) => CustomerBare.fromBare(data);

  [@override](/user/override)
  String toString() =>
      'Customer { name: ${name}, email: ${email}, address: ${address}, orders: ${orders}, metadata: ${metadata} }';
}

extension CustomerBare on Customer {
  Uint8List toBare() {
    final x = Packer();
    pack(x);
    return x.takeBytes();
  }

  static Customer fromBare(data) {
    Unpacker unpacker = Unpacker.fromList(data);
    return unpack(unpacker);
  }

  Packer pack(Packer p) {
    p.packString(name);
    p.packString(email);
    address.pack(p);
    p.packLength(orders.length);
    orders.forEach((e) => e.pack(p));

    p.packLength(metadata.length);
    metadata.forEach((k, v) {
      p.packString(k);
      p.packBinary(v);
    });

    return p;
  }

  static Customer unpack(Unpacker p) {
    final name = p.unpackString();
    final email = p.unpackString();
    Address address;
    address = AddressBare.unpack(p);

    List<Orders1> orders;
    orders = <Orders1>[];
    final ordersLength = p.unpackLength();
    for (var i = 0; i < ordersLength; i++) {
      final e = Anon1Bare.unpack(p);
      orders.add(e);
    }

    Map<String, List<int>> metadata;
    List<MapEntry<String, List<int>>> entries = [];
    final metadataLength = p.unpackLength();
    for (var i = 0; i < metadataLength; i++) {
      final k = p.unpackString();
      final v = p.unpackBinary();
      entries.add(MapEntry(k, v));
    }
    final _map1 = <String, List<int>>{};
    _map1.addEntries(entries);
    metadata = _map1;

    return Customer(
        name: name,
        email: email,
        address: address,
        orders: orders,
        metadata: metadata);
  }
}

更多关于Flutter插件bare的介绍与使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter插件bare的介绍与使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter开发中,bare 并不是一个广为人知或官方支持的插件或库。如果你在某个项目或文档中遇到了这个名称,可能是以下几种情况之一:

  1. 自定义插件bare 可能是某个开发者或团队自定义的插件,用于特定项目或功能。如果是这种情况,你需要查阅相关项目的文档或代码以了解其功能和使用方法。

  2. 拼写错误或误解:可能是拼写错误或误解,实际上你可能想要使用的是其他插件,比如 flutter_barcode_scannerflutter_bloc 或其他类似的插件。

  3. 实验性或未发布的插件bare 可能是一个实验性的插件,尚未正式发布或广泛使用。如果是这种情况,你可以尝试联系作者或查看相关的代码仓库(如GitHub)以获取更多信息。

探索和使用 bare 的步骤

如果你确实找到了一个名为 bare 的插件,并希望探索和使用它,可以按照以下步骤进行:

  1. 查找文档

    • 检查插件的官方文档或README文件,通常会在GitHub仓库或Dart Packages网站上找到。
    • 如果文档不完整或缺失,可以查看插件的源代码,了解其功能和用法。
  2. 安装插件

    • pubspec.yaml 文件中添加插件的依赖项:
      dependencies:
        bare: ^version
      
    • 然后运行 flutter pub get 来安装插件。
  3. 导入插件

    • 在你的Dart文件中导入插件:
      import 'package:bare/bare.dart';
      
  4. 使用插件

    • 根据插件的功能,调用相关的API或组件。例如,如果 bare 是一个用于处理某种数据的插件,你可能会这样使用它:
      var result = Bare.someFunction();
回到顶部