---
title: Quick start
description: This guide gets you started with gRPC in Dart with a simple working example.
weight: 10
spelling: cSpell:ignore Iprotos
---

### Prerequisites

- **[Dart][]** version 2.2 or higher, through the Dart or [Flutter][] SDKs

  For installation instructions, see [Install Dart][] or [Install Flutter][].

- **[Protocol buffer][pb] compiler**, `protoc`, [version 3][proto3]

  For installation instructions, see [Protocol Buffer Compiler
  Installation][pbc-install].

- **Dart plugin** for the protocol compiler:

   1. Install the protocol compiler plugin for Dart (`protoc-gen-dart`) using
      the following command:

      ```sh
      $ pub global activate protoc_plugin
      ```

   2. Update your `PATH` so that the `protoc` compiler can find the plugin:

      ```sh
      $ export PATH="$PATH:$HOME/.pub-cache/bin"
      ```

{{% alert title="Note" color="info" %}}
  Dart gRPC supports the Flutter and Server platforms.
{{% /alert %}}

### Get the example code

The example code is part of the [grpc-dart][] repo.

 1. [Download the repo as a zip file][download] and unzip it, or clone
    the repo:

    ```sh
    $ git clone https://github.com/grpc/grpc-dart
    ```

 2. Change to the quick start example directory:

    ```sh
    $ cd grpc-dart/example/helloworld
    ```

### Run the example

From the `example/helloworld` directory:

 1. Download package dependencies:

    ```sh
    $ pub get
    ```

 2. Run the server:

    ```sh
    $ dart bin/server.dart
    ```

 3. From another terminal, run the client:

    ```sh
    $ dart bin/client.dart
    Greeter client received: Hello, world!
    ```

Congratulations! You've just run a client-server application with gRPC.


### Update the app

In this section you'll update the app to make use of an extra server method. The
gRPC service is defined using [protocol buffers][pb]. To learn more about how to
define a service in a `.proto` file, see [Basics tutorial][]. For now, all you
need to know is that both the server and the client stub have a `SayHello()` RPC
method that takes a `HelloRequest` parameter from the client and returns a
`HelloReply` from the server, and that the method is defined like this:

```protobuf
// 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;
}
```

#### Update the gRPC service

Open `protos/helloworld.proto` and add a new `SayHelloAgain()` method, with the
same request and response types:

```protobuf
// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
  // Sends another greeting
  rpc SayHelloAgain (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;
}
```

Remember to save the file!

#### Regenerate gRPC code

Before you can use the new service method, you need to recompile the updated
proto file. From the `example/helloworld` directory, run the following command:

```sh
$ protoc --dart_out=grpc:lib/src/generated -Iprotos protos/helloworld.proto
```

You'll find the regenerated request and response classes, and client and server
classes in the `lib/src/generated` directory.

Now implement and call the new RPC in the server and client code, respectively.

#### Update the server

Open `bin/server.dart` and add the following `sayHelloAgain()` method to the
`GreeterService` class:

```dart
class GreeterService extends GreeterServiceBase {
  @override
  Future<HelloReply> sayHello(ServiceCall call, HelloRequest request) async {
    return HelloReply()..message = 'Hello, ${request.name}!';
  }

  @override
  Future<HelloReply> sayHelloAgain(ServiceCall call, HelloRequest request) async {
    return HelloReply()..message = 'Hello again, ${request.name}!';
  }
}
```

#### Update the client

Add a call to `sayHelloAgain()` in `bin/client.dart` like this:

```dart
Future<void> main(List<String> args) async {
  final channel = ClientChannel(
    'localhost',
    port: 50051,
    options: const ChannelOptions(credentials: ChannelCredentials.insecure()),
  );
  final stub = GreeterClient(channel);

  final name = args.isNotEmpty ? args[0] : 'world';

  try {
    var response = await stub.sayHello(HelloRequest()..name = name);
    print('Greeter client received: ${response.message}');
    response = await stub.sayHelloAgain(HelloRequest()..name = name);
    print('Greeter client received: ${response.message}');
  } catch (e) {
    print('Caught error: $e');
  }
  await channel.shutdown();
}
```

### Run the updated app

Run the client and server like you did before. Execute the following commands
from the `example/helloworld` directory:

 1. Run the server:

    ```sh
    $ dart bin/server.dart
    ```

 2. From another terminal, run the client. This time, add a name as a command-line
    argument:

    ```sh
    $ dart bin/client.dart Alice
    ```

    You'll see the following output:

    ```sh
    Greeter client received: Hello, Alice!
    Greeter client received: Hello again, Alice!
    ```

### Contributing

If you experience problems with Dart gRPC or have a feature request, [create an
issue][issue] over the [grpc-dart][] repo.

### What's next

- Learn how gRPC works in [Introduction to gRPC](/docs/what-is-grpc/introduction/)
  and [Core concepts](/docs/what-is-grpc/core-concepts/).
- Work through the [Basics tutorial][].
- Explore the [API reference](../api).

[Dart]: https://dart.dev
[Basics tutorial]: ../basics/
[download]: https://github.com/grpc/grpc-dart/archive/master.zip
[Flutter]: https://flutter.dev
[github.com/google/protobuf/releases]: https://github.com/google/protobuf/releases
[grpc-dart]: https://github.com/grpc/grpc-dart
[Install Dart]: https://dart.dev/install
[Install Flutter]: https://flutter.dev/docs/get-started/install
[issue]: https://github.com/grpc/grpc-dart/issues/new
[pb]: https://developers.google.com/protocol-buffers
[proto3]: https://developers.google.com/protocol-buffers/docs/proto3
[pbc-install]: /docs/protoc-installation/
