我的问题是我无法在 dart 中获取 .proto 的客户端代码。我有一个在 C#/.NET Core 7.0 中编译和测试的 .proto。我已成功将服务器部署到另一台计算机,并通过运行 C# 客户端的 Visual Studio 与它进行交互。我想要一个 dart 客户端,以便我可以让我的 flutter 应用程序与服务器交互。虽然花了很多功夫,但我最终还是弄清楚了如何在 dart 中获取自动生成的代码。我开始尝试使用“快速入门指南”,但没有取得任何进展。找到这些东西后我最终能够得到它们: 弄清楚如何从中实际获取可调用的协议:
https://gayan-justo.medium.com/working-with-grpc-with-flutter-on-windows-17493528e6a2弄清楚如何从“编译协议缓冲区”部分中实际获取自动生成的文件:
https://protobuf.dev/getting-started/darttutorial/我现在的问题是我似乎无法弄清楚如何为客户端使用自动生成的类。输出是4个文件:
.pb.dart
.pbenum.dart
.pbjson.dart
.pbserver.dart
在我可以在网上找到的所有示例中,每个人似乎都调用自动生成的“客户端”类。我的自动生成的文件中没有任何“客户端”代码。我拥有的最接近的东西是一个 Api 类,它将 RpcClient (一个抽象类)放入其构造函数中。我想也许我可以使用 grpc 包中的 Client 类,但它不是从 RpcClient 继承的,并且不起作用。
class GpioApi {
$pb.RpcClient _client;
GpioApi(this._client);
$async.Future<TimedOnResponse> timedOn($pb.ClientContext? ctx, TimedOnRequest request) =>
_client.invoke<TimedOnResponse>(ctx, 'Gpio', 'TimedOn', request, TimedOnResponse())
;
$async.Future<TimedOffResponse> timedOff($pb.ClientContext? ctx, TimedOffRequest request) =>
_client.invoke<TimedOffResponse>(ctx, 'Gpio', 'TimedOff', request, TimedOffResponse())
;
}
我的预感是,我必须告诉 protoc 为客户端而不是服务器进行编译(您可以通过更新 .csproj 中的标签在 C# 中执行此操作,但我在 flutter/dart 和我所有的 google 搜索中找不到等效项继续给我这些例子,其中只有带有客户端类的自动生成的代码。这是我可以在 .proto 中指定的内容吗?有人能给我指出正确的方向吗?
这是我的.proto:
syntax = "proto3";
package gpio;
service Gpio {
rpc TimedOn (TimedOnRequest) returns (TimedOnResponse);
rpc TimedOff (TimedOffRequest) returns (TimedOffResponse);
}
message TimedOnRequest {
int32 pin = 1;
double seconds = 2;
}
message TimedOnResponse {
bool success = 1;
string message = 2;
}
message TimedOffRequest {
int32 pin = 1;
}
message TimedOffResponse {
bool success = 1;
string message = 2;
}
协议-I=$SRC_DIR --dart_out=$DST_DIR $SRC_DIR/addressbook.proto
我必须这样修改它:
protoc -I=$SRC_DIR --dart_out=grpc:$DST_DIR $SRC_DIR/addressbook.proto