Flutter Protocol Buffers生成插件protobuf_generator的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

Flutter Protocol Buffers生成插件protobuf_generator的使用

protobuf_generator

Pub package publisher

protobuf_generator 是一个用于将 Protocol Buffers 文件编译为 Dart 源代码的 Flutter 生成器包。它使用 build_runner(即 Dart 构建管道)来完成这一任务,而无需手动安装 protoc 编译器或 Dart Protobuf 插件 protoc_plugin

protobuf_generator 包会下载必要的 Protobuf 依赖项和 googleapis 到本地临时目录。

安装

在你的 pubspec.yaml 文件中添加必要的依赖项:

dependencies:
  protobuf: <latest>
  protoc_plugin: <latest>

dev_dependencies:
  build_runner: <latest>
  protobuf_generator: <latest>

配置

你必须在与 pubspec.yaml 相邻的位置添加一个 build.yaml 文件,并在其中指定 .proto 文件的位置:

targets:
  $default:
    sources:
      - $package$
      - lib/**
      - proto/** # Your .proto directory

这将使用 protobuf_generator 的默认配置。

你还可以配置自定义选项:

targets:
  $default:
    sources:
      - $package$
      - lib/$lib$
      - proto/**
    builders:
      protobuf_generator:
        options:
          # 使用的 Protobuf 编译器版本。
          # (默认: "27.2",确保使用引号)
          protobuf_version: "27.2"
          
          # 使用的 Dart protoc_plugin 包版本。
          # (默认: "21.1.2",确保使用引号)
          protoc_plugin_version: "21.1.2"

          # 被视为所有 Protobuf 文件根目录的目录。
          # (默认: "proto/")
          proto_root_dir: "proto/"

          # 在编译期间传递给 Protobuf 编译器的包含路径。
          # (默认: ["proto/"])
          proto_paths:
            - "proto/"

          # 生成的 Dart 输出文件的根目录。
          # (默认: "lib/src/proto")
          dart_out_dir: "lib/src/generated"

          # 是否使用 PATH 上可用的 "protoc" 命令而不是下载一个。
          # (默认: false)
          use_installed_protoc: false

          # 是否预编译 protoc_plugin Dart 脚本以提高性能。
          # (默认: true)
          precompile_protoc_plugin: true

          # 是否生成 proto 文件的描述符文件。
          # (默认: false)
          generate_descriptor_file: false

运行

一切设置完成后,你可以简单地运行 build_runner 包:

dart run build_runner build

有时 build_runner 会比预期更长时间地缓存结果,因此在这种情况下,可能需要删除 .dart_tool/build 目录。

贡献

如果你已经读到这里,那么恭喜🎉🎉🎉。你可以通过以下几种方式为 protobuf_generator.dart 社区做出贡献:

  • 选择任何标记为 "good first issue" 的问题。
  • 提出任何功能或增强建议。
  • 报告错误。
  • 修复错误。
  • 编写和改进一些文档。文档非常重要,其重要性不可过分强调!
  • 提交拉取请求 😊

更多关于Flutter Protocol Buffers生成插件protobuf_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Protocol Buffers生成插件protobuf_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用protobuf_generator插件来生成Protocol Buffers代码的示例。这个插件允许你将.proto文件转换为Dart代码,以便在Flutter应用中使用。

1. 添加依赖

首先,你需要在你的pubspec.yaml文件中添加protobufprotoc_plugin依赖。

dependencies:
  flutter:
    sdk: flutter
  protobuf: ^x.y.z  # 请替换为最新版本号

dev_dependencies:
  build_runner: ^x.y.z  # 请替换为最新版本号
  protoc_plugin: ^x.y.z  # 请替换为最新版本号

2. 创建.proto文件

在你的Flutter项目根目录下创建一个protos文件夹,并在其中创建一个.proto文件,例如message.proto

// message.proto
syntax = "proto3";

package example;

message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;
}

3. 配置build.yaml

在Flutter项目的根目录下创建一个build.yaml文件,用于配置protoc_plugin

targets:
  $default:
    builders:
      protoc:
        enabled: true
        options:
          plugin: .dart_tool/package_manager_plugins/protoc_plugin/linux-x64/protoc-gen-dart/protoc-gen-dart  # 根据你的平台调整路径
        outputs:
          - '$package$/lib/generated/$basename$.pb.dart'

4. 生成Dart代码

在Flutter项目根目录下运行以下命令以生成Dart代码:

flutter pub get
flutter pub run build_runner build

这将读取message.proto文件并生成一个message.pb.dart文件,通常位于lib/generated/目录下。

5. 使用生成的代码

现在你可以在你的Flutter应用中使用生成的代码。例如,在lib/main.dart文件中:

import 'package:flutter/material.dart';
import 'generated/message.pb.dart';  // 根据实际生成路径调整

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Protobuf Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('Creating a Person message:'),
              _createPersonMessage(),
            ],
          ),
        ),
      ),
    );
  }

  Widget _createPersonMessage() {
    final Person person = Person()
      ..name = 'John Doe'
      ..id = 1234
      ..email = 'john.doe@example.com';

    // 打印生成的序列化数据
    final Uint8List serializedData = person.writeToBuffer();
    print('Serialized Data: ${serializedData.toList()}');

    // 反序列化数据
    final Person deserializedPerson = Person.fromBuffer(serializedData);
    print('Deserialized Person: ${deserializedPerson.name}, ${deserializedPerson.id}, ${deserializedPerson.email}');

    return Text('Person message created and serialized/deserialized');
  }
}

总结

以上步骤展示了如何在Flutter项目中使用protobuf_generator插件来生成和使用Protocol Buffers代码。通过配置build.yaml并使用build_runner,你可以轻松地将.proto文件转换为Dart代码,并在你的Flutter应用中使用它们。

回到顶部