Flutter集成gRPC
1、安装Flutter(会自动安装Dart的),这里就不再多说了,不清楚的看这里:https://flutterchina.club/get-started/install/
2、插件,我这里就以IDEA为例
首先装Flutter
我这里装过了,就没截Flutter安装的图
然后就是就是装protobuf support,一样的,搜索的内容换一下就好了
3、配置环境变量
export PATH=$HOME/flutter/bin:$HOME/flutter/bin/cache/dart-sdk/bin:$HOME/.pub-cache/bin:$PATH
这里解释一下,/flutter/bin主要是为protoc配置的。/flutter/bin/cache/dart-sdk/bin主要是为pub配置的,这个不配置pub命令是找不到的,如果你是手动安装的dart-sdk那么这个目录是要自己调整的,到dart-sdk下的bin目录就好了,装flutter自动装dart是在这个目录的。/.pub-cache/bin主要是为了protoc-gen-dart配置的,这个主要是proto文件编译dart文件的编译器,这个现在是没有的,等下执行了pub就会生成这个目录,也可以生成之后再配置。
4、安装Dart的protoc插件
pub global activate protoc_plugin
我就要卡在这半天,这个pub命令找不到,是因为没有配置dart-sdk/bin的环境变量,pub是在dart-sdk里的。
5、创建Flutter项目,新建proto文件。
Flutter项目创建就不说了,创建的时候选择Flutter项目就好了。
.proto文件
syntax = "proto3";
//生成多文件
option java_multiple_files = true;
//包名
option java_package = "io.grpc.examples.MyAttention";
//定义MyAttentionRequest消息类型,用于客户端消息
message MyAttentionRequest{
string workId = 1;
int32 page = 2;
int32 number = 3;
}
//定义MyAttentionResponse消息类型,用于服务端消息返回
message MyAttentionResponse{
repeated SeniorInfo seniorInfo = 1;// 复杂的对象List
int32 allNumber = 2;
}
//对象senior
message SeniorInfo{
int64 seniorId = 1;
string name = 2;
string gender = 3;
int64 age = 4;
string address = 5;
}
// 定义服务
service MyAttentionService {
// 服务中的方法,传过来一个MyAttentionRequest类型的对象,返回一个MyAttentionResponse类型的对象
rpc communication(MyAttentionRequest) returns (MyAttentionResponse) {}
}
5、编译生成dart代码
1、手动敲
protoc --dart_out=grpc:lib/generated -Iprotos protos/helloworld.proto
这里是指cd到了当前项目或者直接用IEDA的Terminal去敲这个命令,不然找不到的。lib/generated这个目录是要你自己生成的,不然会找不到目录的,-Iprotos后面是目录/文件全称。
2、脚本
我这里用的是make,脚本就是省心多了,不用管,直接运行就好,直接编译,直接运行make就好了
PROTO_ROOT_DIR = $(shell brew --prefix)/Cellar/protobuf/3.7.0/include
VERSION=0.1.0
default: clean stubs
## Dart requires you to manually ship all google provided proto files too.
stubs:
mkdir -p lib/generated
protoc -I=protos --dart_out=grpc:lib/generated protos/*.proto
protoc -I$(PROTO_ROOT_DIR) --dart_out=lib/generated $(PROTO_ROOT_DIR)/google/protobuf/*.proto
clean:
rm -rf build lib/generated
run-local:
dart bin/server.dart
build-docker:
docker build -t pambrose/flutter_module:${VERSION} .
run-docker:
docker run -p 50051:50051 pambrose/flutter_module:${VERSION}
push-docker:
docker push pambrose/flutter_module:${VERSION}
运行后我们再看看项目就生成了client需要的dart文件
6、Flutter配置
grpc:^0.6.6
protobuf: ^0.13.4
再packages get一下,然后你会发现你自动生成的.pbgrpc.dart报错了
然后你看看包就知道了
压根就没有service_api.dart之个文件,不过没关系,跑到grpc.dart里面一看,他导了所有grpc库,然后就把service_api.dart换成grpc.dart就行了,这个估计是编译器与grpc版本不一致导致的。现在就可以开始写Flutter Client代码了;
关于Flutter Grpc Client连接管理,有兴趣的可以看一下。