![c3279e05cc2a7b999564fdc4954e4294.png](https://img-blog.csdnimg.cn/img_convert/c3279e05cc2a7b999564fdc4954e4294.png)
一.简介
flutter中使用protobuf的话,需要将proto文件转化成dart文件,我们需要借助官方编译工具进行编译。
二.安装protobuf
官放说Protocol Compiler是用C++编写的,使用它需要具备C++环境
安装C++:
sudo apt-get install autoconf automake libtool curl make g++ unzip
安装ProtoBuf发行版:
如果你的是源码版,需要自己在编译一下
git clone https:// github.com/protocolbuff ers/protobuf.git #下载源码
cd protobuf
git submodule update --init --recursive
./autogen.sh
发行版地址:
Releases · protocolbuffers/protobufgithub.com![3f42d36b0f4e9958d08e4014e07c3a14.png](https://img-blog.csdnimg.cn/img_convert/3f42d36b0f4e9958d08e4014e07c3a14.png)
![63e9bc6fdfa5dad18012d8e64d2a9ab4.png](https://img-blog.csdnimg.cn/img_convert/63e9bc6fdfa5dad18012d8e64d2a9ab4.png)
需要去下载对应的源码包,由于没有dart的包,我直接下载all包
![8b73937544f0f16aefea6d38af4a42d3.png](https://img-blog.csdnimg.cn/img_convert/8b73937544f0f16aefea6d38af4a42d3.png)
下载完成之后,解压,进到目录中执行下面命令编译安装
./configure
make
make check
sudo make install
sudo ldconfig # refresh shared library cache.
这样Protocol Compiler就安装完成了
![a6e9b1b5b7e8d6201e1dc91f59cd499b.png](https://img-blog.csdnimg.cn/img_convert/a6e9b1b5b7e8d6201e1dc91f59cd499b.png)
OK,我先试试,直接生成dart文件可不可以
![10ea83dcfba5d9eaab90fa3e791b0867.png](https://img-blog.csdnimg.cn/img_convert/10ea83dcfba5d9eaab90fa3e791b0867.png)
GG,果然提示我们没有安装protoc-gen-dart插件,不慌,还在掌握之中,想要编成dart的话,是比编译成java麻烦一点点,编译成java直接下载个protobuf-java的包,执行命令就好了,但是dart的话,需要插件,那下面去下载dart-lang插件
dart-lang/protobufgithub.com![82a3d1a1247c42e1c228dba5554bf4f4.png](https://img-blog.csdnimg.cn/img_convert/82a3d1a1247c42e1c228dba5554bf4f4.png)
![67fb621a232b4c83540b620bea9b72ca.png](https://img-blog.csdnimg.cn/img_convert/67fb621a232b4c83540b620bea9b72ca.png)
下载完成之后,要执行
dart pub global activate protoc_plugin
如果你没有安装dart和pub环境,这条命令是无法执行成功的,但是插件编译还依赖dart环境
所以先去安装dart环境
获取 Dart SDKdart.cn![a24f485f085ad05f33844fa5bc15bb4b.png](https://img-blog.csdnimg.cn/img_convert/a24f485f085ad05f33844fa5bc15bb4b.png)
按照官网命令行安装就好了,但是网络原因,我apt有问题,所以我用deb安装
sudo dpkg -i dart_2.10.4-1_amd64.deb
export PATH="$PATH:/usr/lib/dart/bin"
dart --version
![e42fb7615696206fe25fc43dcca20f21.png](https://img-blog.csdnimg.cn/img_convert/e42fb7615696206fe25fc43dcca20f21.png)
这样dart就安装好了,下面 pub清华源
Tsinghua Open Source Mirrormirror.tuna.tsinghua.edu.cn![60cb752f56c7454a9dcc80161032404b.png](https://img-blog.csdnimg.cn/img_convert/60cb752f56c7454a9dcc80161032404b.png)
然后,我们执行dart pub global activate protoc_plugin
![59f8c025e2109064b8e367109f335833.png](https://img-blog.csdnimg.cn/img_convert/59f8c025e2109064b8e367109f335833.png)
如果出现:
![77ae350d4531955279216173c86404bf.png](https://img-blog.csdnimg.cn/img_convert/77ae350d4531955279216173c86404bf.png)
直接执行:
export PATH="$PATH":"$HOME/.pub-cache/bin"
然后重新Pub install就好了
截至到这时,我们支持编译成dart的protobuf算是安装完成了
三.使用
先搞个.proto文件试试,能不能生成dart文件
![63af1761ce78b6308bf2bc565bf93878.png](https://img-blog.csdnimg.cn/img_convert/63af1761ce78b6308bf2bc565bf93878.png)
好像生成成功了
![f6e01b9d6da942fed7b7e9f10684bd3b.png](https://img-blog.csdnimg.cn/img_convert/f6e01b9d6da942fed7b7e9f10684bd3b.png)
果然成功了,这下就弥补了公司转化protobuf的python脚本中不能转化dart的空白,等回头把这玩意加到公司的python脚本中,就完美了,也不算浪费了我两小时。
这四个文件都有自己不同的作用,只需要引用自己需要的就可以了,也可以全部引入,你要是讲究,我记得protobuf应该有参数设置。
代码中使用:
把生成好的文件复制到代码中
![ac220d5caf9460cbad164b0b2acad790.png](https://img-blog.csdnimg.cn/img_convert/ac220d5caf9460cbad164b0b2acad790.png)
引入插件
protobuf: ^1.1.0 #使用protobuf
调用
import 'package:flutterrobot/protobuf/b.pb.dart';
··· 例子:我的b.pb.dart文件中放的是person类
var p1 = person.create();
p1.age=10;
p1.country="100";
var writeToBuffer = p1.writeToBuffer();
print(writeToBuffer);
var p2 = person.fromBuffer(writeToBuffer);
print("年龄:${p2.age}");
···
输出:
![a88f3c2bc0096a15e9f1f36a97c44b96.png](https://img-blog.csdnimg.cn/img_convert/a88f3c2bc0096a15e9f1f36a97c44b96.png)
OK,完美,后续搭配之前的tcp通讯和自定义协议的格式,最后在放个CRC校验,一个数据帧就这样完成了。