Flutter Protocol Buffers构建插件protoc_builder的使用

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

Flutter Protocol Buffers构建插件protoc_builder的使用

protoc_builder 是一个Dart包,用于通过 build_runner(即Dart构建管道)将Protocol Buffer文件编译为Dart源代码。它可以在不手动安装 protoc 编译器或Dart Protobuf插件的情况下完成此任务。protoc_builder 包会根据你的平台下载必要的Protobuf依赖项到临时本地目录,从而简化开发过程。

安装

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

dev_dependencies:
  build_runner: ^2.3.0 # 使用最新版本
  protoc_builder: ^2.4.0 # 使用最新版本

配置

你需要将 .proto 文件添加到与 pubspec.yaml 文件同级的 build.yaml 文件中:

默认配置
targets:
  $default:
    sources:
      - $package$
      - lib/$lib$
      - proto/** # 你的 .proto 文件目录

这将使用 protoc_builder 的默认配置。

自定义配置

你也可以自定义选项:

targets:
  $default:
    sources:
      - $package$
      - lib/$lib$
      - proto/**
    builders:
      protoc_builder:
        options:
          # 使用的Protobuf编译器版本
          # (默认: "3.19.1",请确保使用引号)
          protobuf_version: "3.19.1"
          
          # 使用的Dart protoc_plugin包版本
          # (默认: "20.0.1",请确保使用引号)
          protoc_plugin_version: "20.0.1"
          
          # 被视为所有Protobuf文件根目录的目录
          # (默认: "proto/")
          root_dir: "proto/"
          
          # 在编译期间传递给Protobuf编译器的包含路径
          # (默认: ["proto/"])
          proto_paths:
            - "proto/"
          
          # 生成的Dart输出文件的根目录
          # (默认: "lib/src/proto")
          out_dir: "lib/src/generated"
          
          # 启用gRPC标志,以生成 `.pbgrpc.dart` 文件
          # (默认: false)
          grpc: true
          
          # 使用PATH上可用的 "protoc" 命令而不是下载一个新的
          # (默认: false)
          use_installed_protoc: false
          
          # 是否预编译protoc_plugin Dart脚本以提高性能
          # (默认: true)
          precompile_protoc_plugin: true

运行

一旦所有设置都完成,你可以简单地运行 build_runner 包:

dart run build_runner build

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

完整示例Demo

以下是一个完整的示例项目,展示了如何使用 protoc_builder.proto 文件编译为Dart代码。

项目结构
my_flutter_app/
├── lib/
│   └── src/
│       └── generated/ # 生成的Dart代码将放置在这里
├── proto/
│   └── example.proto
├── pubspec.yaml
└── build.yaml
example.proto
syntax = "proto3";

option dart_package = "my_flutter_app.generated";

message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;
}
pubspec.yaml
name: my_flutter_app
description: A new Flutter project.

environment:
  sdk: ">=2.12.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter

dev_dependencies:
  build_runner: ^2.3.0
  protoc_builder: ^2.4.0
  flutter_test:
    sdk: flutter
build.yaml
targets:
  $default:
    sources:
      - $package$
      - lib/$lib$
      - proto/** # 你的 .proto 文件目录
    builders:
      protoc_builder:
        options:
          protobuf_version: "3.19.1"
          protoc_plugin_version: "20.0.1"
          root_dir: "proto/"
          proto_paths:
            - "proto/"
          out_dir: "lib/src/generated"
          grpc: false
          use_installed_protoc: false
          precompile_protoc_plugin: true
运行构建

在终端中运行以下命令以生成Dart代码:

dart run build_runner build

生成的Dart代码将位于 lib/src/generated 目录下。你可以在这个目录中找到 example.pb.dart 文件,该文件包含了从 example.proto 文件生成的Dart类。

使用生成的代码

在你的Flutter应用程序中,你可以像使用普通Dart类一样使用生成的代码。例如,在 main.dart 中:

import 'package:flutter/material.dart';
import 'package:my_flutter_app/generated/example.pb.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Protocol Buffers Example')),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              // 创建一个Person对象
              final person = Person()
                ..name = 'John Doe'
                ..id = 123
                ..email = 'john.doe@example.com';

              // 打印Person对象
              print(person);
            },
            child: Text('Create Person'),
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


在Flutter项目中,使用Protocol Buffers(简称Protobuf)可以有效地进行跨平台的数据序列化。protoc_builder是一个用于生成Protobuf相关Dart代码的Flutter插件。下面是如何在Flutter项目中配置和使用protoc_builder来生成和使用Protobuf代码的示例。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加protoc_builder依赖。注意,protoc_builder通常与其他Protobuf相关包(如protobuf)一起使用。

dependencies:
  flutter:
    sdk: flutter
  protobuf: ^2.0.0  # 确保使用兼容的版本

dev_dependencies:
  build_runner: ^2.0.0  # 用于构建过程
  protoc_builder: ^0.1.0  # 假设这是当前版本,请检查最新版本

2. 定义Protobuf文件

创建一个.proto文件,例如example.proto,定义你的消息结构。

syntax = "proto3";

package example;

message User {
  string name = 1;
  int32 age = 2;
}

3. 配置build.yaml

在项目的根目录下创建或编辑build.yaml文件,以配置protoc_builder

targets:
  $default:
    builders:
      protoc_builder:protoc_builder:
        enabled: true
        generate_for:
          include: ["**/*.proto"]
        options:
          plugin: protoc-gen-dart=/path/to/protoc-gen-dart  # 指定protoc-gen-dart插件的路径

注意:/path/to/protoc-gen-dart需要替换为实际protoc-gen-dart插件的路径。你可以通过全局安装protoc-gen-dart来简化路径配置。

4. 生成Dart代码

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

flutter pub run build_runner build

这将根据example.proto文件生成对应的Dart类文件。

5. 使用生成的Dart代码

生成的Dart代码通常位于lib/generated目录下(这个目录可以根据配置调整)。你可以直接导入并使用这些生成的类。

import 'package:your_app/generated/example.pb.dart';

void main() {
  // 创建一个User对象
  User user = User()
    ..name = 'John Doe'
    ..age = 30;

  // 序列化User对象为字节数组
  List<int> buffer = user.writeToBuffer();

  // 从字节数组反序列化回User对象
  User deserializedUser = User.fromBuffer(buffer);

  print('Name: ${deserializedUser.name}, Age: ${deserializedUser.age}');
}

注意事项

  • 确保protocprotoc-gen-dart插件已经正确安装并配置在系统的PATH中,或者在build.yaml中指定正确的路径。
  • protoc_builder的具体版本和配置可能会随着时间变化,请参考最新的官方文档和示例。
  • 如果遇到路径或依赖问题,尝试清理并重新获取依赖:flutter pub getflutter clean

通过上述步骤,你可以在Flutter项目中成功集成并使用protoc_builder来生成和使用Protobuf相关的Dart代码。

回到顶部