Flutter Protocol Buffers生成插件protobuf_generator的使用
Flutter Protocol Buffers生成插件protobuf_generator的使用
protobuf_generator
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
更多关于Flutter Protocol Buffers生成插件protobuf_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用protobuf_generator
插件来生成Protocol Buffers代码的示例。这个插件允许你将.proto
文件转换为Dart代码,以便在Flutter应用中使用。
1. 添加依赖
首先,你需要在你的pubspec.yaml
文件中添加protobuf
和protoc_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应用中使用它们。