本篇记录下 Flutter 使用 protobuf

安装Protoc

这个不做赘述,直接搜索对应平台下载,配置环境变量

安装 protoc-gen-dart

这个是 Dart 的 Protocol Buffers 插件 , 直接全局安装

1
dart pub global activate protoc_plugin

然后查看实际路径

1
dart pub global list

将对应路径配置环境变量 , 然后查看得到结果

1
Activated protoc_plugin 版本 at /Users/用户/.dart-sdks/bin

验证是否可用

1
protoc-gen-dart --version

使用

比如这边我是将 proto 文件放在 package 中开发 , 目录如下

1
2
3
4
5
package
- lib
- pb
- proto
- service

首先要添加依赖

1
2
protobuf: ^3.1.0
grpc: ^4.0.1 // 如果使用到了grpc

然后将 proto 文件拷贝到 proto 目录下后 , 就可以使用命令生成 pb 文件了

1
protoc -I=lib/proto --dart_out=grpc:lib/pb/ lib/proto/*ext.proto

若使用到了 google/protobuf/empty.proto

则需要加上一段

1
protoc -I=lib/proto --dart_out=grpc:lib/pb/ lib/proto/*ext.proto google/protobuf/empty.proto

然后即可在 service 下新建自己的服务类,示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class LogicService {
final String host;
final int port;

late final LogicExtClient _client;

LogicService({required this.host, required this.port}) {
final channel = ClientChannel(
host,
port: port,
options: const ChannelOptions(
credentials: ChannelCredentials.insecure(), // 如果是安全连接,请配置正确的证书
),
);
_client = LogicExtClient(channel);
}

Future<SendMessageResp> sendMessageToFriend(SendMessageReq request,
{CallOptions? options}) async {
try {
return await _client.sendMessageToFriend(request, options: options);
} catch (e) {
print(e);
return Future.error(e);
}
}
}

也可以通过 build_runner 来生成 , 不过基本上协议确定后是很少改动的 , 而网络 http 请求这块通常我是用 Retrofit 也会涉及到使用 build_runner 生成 , 为避免每次运行重新生成文件太多,则 Proto 这部分生成直接通过命令行来完成