Flutter gRPC通信插件grpc的使用

Flutter gRPC通信插件grpc的使用

简介

Dart 实现了 gRPC:一个高性能、开源、通用的RPC框架,特别为移动设备和HTTP/2进行了优化。gRPC支持多种平台,包括Flutter。

  • Dart
  • pub package

更多详情可以参考:

完整文档请参见 Dart gRPC

支持的平台

注意:

  • grpc-web 通过 package:grpc/grpc_web.dart 支持。
  • UDS-unix domain socket 在SDK版本 >= 2.8.0 中支持。

示例代码

HelloWorld 示例

这是一个简单的示例,展示了如何使用Dart gRPC库执行单向RPC(unary RPC)。

dependencies:
  grpc: ^4.0.0
  protoc_plugin: ^19.1.0
syntax = "proto3";

option java_package = "io.grpc.examples.helloworld";
option csharp_namespace = "GreeterClient";

package helloworld;

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}
import 'package:grpc/grpc.dart';
import 'package:helloworld/helloworld.pbgrpc.dart';

class GreeterClient {
  final ClientChannel channel;

  GreeterClient({required String host, int port = 50051})
      : channel = ClientChannel(host,
            port: port,
            options: ChannelOptions(
              credentials: ChannelCredentials.insecure(),
            ));

  Future<HelloReply> sayHello(String name) async {
    final greeter = GreeterClient(channel);
    final request = HelloRequest()..name = name;
    final response = await greeter.sayHello(request);
    return response;
  }

  void close() {
    channel.shutdown();
  }
}

void main() async {
  final client = GreeterClient(host: 'localhost');
  try {
    final response = await client.sayHello('World');
    print('Response: ${response.message}');
  } catch (e) {
    print('Error: $e');
  } finally {
    client.close();
  }
}

完整示例项目结构

为了更好地理解,以下是完整的项目结构和步骤:

1. 创建项目

创建一个新的Flutter项目:

flutter create flutter_grpc_example
cd flutter_grpc_example

2. 添加依赖

pubspec.yaml 文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  grpc: ^4.0.0
  protobuf: ^2.1.0
  protoc_plugin: ^19.1.0

3. 编写Protobuf文件

创建一个名为 helloworld.proto 的文件,并将上述的Protobuf内容粘贴进去。

4. 生成 Dart 代码

使用 protoc 工具生成 Dart 代码:

protoc --dart_out=grpc:lib/src -I. helloworld.proto

5. 编写客户端代码

将上述 GreeterClient 类的内容复制到 lib/main.dart 文件中,并确保调用 sayHello 方法以测试连接。

6. 运行项目

确保你有一个gRPC服务器正在运行,并且可以通过指定的主机和端口访问。然后运行你的Flutter应用:

flutter run

通过以上步骤,你应该能够成功地在Flutter应用中使用gRPC进行通信。如果你遇到任何问题或有功能请求,请提交issue


更多关于Flutter gRPC通信插件grpc的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter gRPC通信插件grpc的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用grpc插件来实现gRPC通信的示例。这个示例将展示如何设置gRPC客户端,并调用一个简单的gRPC服务。

1. 设置Flutter项目

首先,确保你已经有一个Flutter项目。如果没有,可以使用以下命令创建一个新的Flutter项目:

flutter create grpc_example
cd grpc_example

2. 添加依赖

pubspec.yaml文件中添加grpc和相关依赖:

dependencies:
  flutter:
    sdk: flutter
  grpc: ^x.y.z  # 请替换为最新版本号
  protobuf: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

3. 定义.proto文件

创建一个.proto文件来定义你的gRPC服务和消息。例如,创建一个名为example.proto的文件:

syntax = "proto3";

package example;

service ExampleService {
  rpc SayHello (HelloRequest) returns (HelloResponse);
}

message HelloRequest {
  string name = 1;
}

message HelloResponse {
  string message = 1;
}

4. 生成gRPC代码

使用protoc编译器和grpc插件来生成Dart代码。你需要下载并安装protoc编译器,并安装protoc-gen-dartprotoc-gen-grpc-dart插件。

假设你已经安装了这些工具,可以使用以下命令生成Dart代码:

protoc --dart_out=grpc:. --plugin=protoc-gen-dart=$(which protoc-gen-dart) example.proto
protoc --grpc_dart_out=grpc:. --plugin=protoc-gen-grpc-dart=$(which protoc-gen-grpc-dart) example.proto

这将在当前目录下生成example.pb.dartexample.pbgrpc.dart文件。

5. 配置Flutter项目

将生成的Dart文件添加到你的Flutter项目中。通常,你可以将它们放在lib/src/protos目录下(如果还没有这个目录,请创建它)。

6. 实现gRPC客户端

lib目录下创建一个新的Dart文件(例如main.dart),并添加以下代码来实现gRPC客户端:

import 'package:flutter/material.dart';
import 'package:grpc/grpc.dart';
import 'dart:convert' as convert;
import 'package:example/src/protos/example.pb.dart' as example_pb;
import 'package:example/src/protos/example.pbgrpc.dart' as example_pbgrpc;

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter gRPC Example'),
        ),
        body: Center(
          child: GrpcClientExample(),
        ),
      ),
    );
  }
}

class GrpcClientExample extends StatefulWidget {
  @override
  _GrpcClientExampleState createState() => _GrpcClientExampleState();
}

class _GrpcClientExampleState extends State<GrpcClientExample> {
  String _response = '';

  void _callGrpcService() async {
    final channel = ClientChannel('localhost',
        port: 50051,
        options: ChannelOptions(
            credentials: ChannelCredentials.insecure()));

    final stub = example_pbgrpc.ExampleServiceClient(channel);

    final request = example_pb.HelloRequest().name = 'World';

    try {
      final response = await stub.sayHello(request);
      setState(() {
        _response = response.message;
      });
    } catch (e) {
      setState(() {
        _response = 'Error: ${convert.jsonEncode(e.toString())}';
      });
    } finally {
      await channel.shutdown();
    }
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('gRPC Response: $_response'),
        ElevatedButton(
          onPressed: _callGrpcService,
          child: Text('Call gRPC Service'),
        ),
      ],
    );
  }
}

7. 运行Flutter应用

确保你的gRPC服务器正在运行,并且监听在localhost:50051。然后,你可以运行Flutter应用:

flutter run

点击按钮后,Flutter应用将通过gRPC调用服务器,并显示服务器的响应。

这个示例展示了如何在Flutter项目中使用grpc插件进行gRPC通信。你可以根据自己的需求调整.proto文件和服务实现。

回到顶部