Flutter GraphQL客户端代码生成插件graphql_client_gen的使用

Flutter GraphQL客户端代码生成插件graphql_client_gen的使用

Generates opinionated graphql client annotated classes and methods defined by graphql_client_annotation for generating opinionated graphql client class.

The annotated classes must depend on GraphQLClient from this package in order to generate successfully.

配置 Setup

要为最新发布的 graphql_client_gen 版本配置您的项目,请参阅 example

示例 Example

假设有一个实体类 Example 和一个带有 @gqlClient 注解的 graphql 客户端类 ExampleRemoteSource

import 'package:graphql/client.dart';
import 'package:graphql_client_annotation/graphql_client_annotation.dart';

part 'example_remote_source.gqlc.dart';

@gqlClient
abstract class ExampleRemoteSource {
  const factory ExampleRemoteSource(
    GraphQLClient client,
  ) = _ExampleRemoteSource;

  @Query(
    parser: Example.fromJson,
    r'''
    query detailExample($id: String!) {
      detailExample(detailExampleInput: { exampleId: $id }) {
        id
        name
      }
    }
    ''',
  )
  Future<QueryResult<Example>> getExample1(Map<String, dynamic> variables);
}

构建后会生成对应的部分文件 example_remote_source.gqlc.dart

part of 'example_remote_source.dart';

class _ExampleRemoteSource implements ExampleRemoteSource {
  const _ExampleRemoteSource(this._client);

  final GraphQLClient _client;

  static final _$getExample1Gql = gql(r'''
    query detailExample($id: String!) {
      detailExample(detailExampleInput: { exampleId: $id }) {
        id
        name
      }
    }
    ''');
  @override
  Future<QueryResult<Example>> getExample1(Map<String, dynamic> variables) {
    final QueryOptions<Example> options = QueryOptions<Example>(
      document: _$getExample1Gql,
      variables: variables,
      parserFn: Example.fromJson,
    );
    return _client.query(options);
  }
}

运行代码生成器 Running the code generator

添加注解后,您需要运行代码生成器以生成缺失的 .gqlc.dart 文件。

在 Dart 包中,运行以下命令:

dart run build_runner build

在 Flutter 包中,运行以下命令:

flutter pub run build_runner build

注解值 Annotation values

每个目标类必须是一个抽象类,并用 @GQLClient 或预定义的 @gqlClient 注解标记,每个将使用 GraphQLClient 的方法必须用 @Mutation@Query 注解。

每个带注解的方法生成的代码默认返回值为 Future<QueryResult<YourEntity>>,其中 YourEntity 是您在 @Mutation@Query 中定义的 parser 预期创建的类。

如果要自定义返回值,可以在 @GQLClient@Mutation/@Query 中定义 mapper。例如:

给定一个库 app_gql_client.dart

import 'package:graphql/client.dart';
import 'package:graphql_client_annotation/graphql_client_annotation.dart';
import 'package:meta/meta.dart';

@optionalTypeArgs
MyEntity<T> queryResultMapper<T>(QueryResult<T> queryResult) {
  return MyEntity<T>();
}

@optionalTypeArgs
MyEntity<Object> queryResultMapper2<T>(QueryResult<T> queryResult) {
  return MyEntity<Object>();
}

class MyEntity<T> {}

const GQLClient appGQLClient = GQLClient(mapper: queryResultMapper);

以及一个抽象类 ExampleRemoteSource

import 'package:example/src/app_gql_client.dart';
import 'package:example/src/example.dart';
import 'package:graphql/client.dart';
import 'package:graphql_client_annotation/graphql_client_annotation.dart';

part 'example_remote_source.gqlc.dart';

@appGQLClient
abstract class ExampleRemoteSource {
  const factory ExampleRemoteSource(
    GraphQLClient client,
  ) = _ExampleRemoteSource;

  @Query(
    parser: Example.fromMap,
    fetchPolicy: FetchPolicy.networkOnly,
    r'''
    query detailExample($id: String!) {
      detailExample(detailExampleInput: { exampleId: $id }) {
        id
        name
      }
    }
    ''',
  )
  Future<MyEntity<Example>> getExample1(Map<String, dynamic> variables);

  @Mutation(
    parser: Example.fromMap,
    mapper: queryResultMapper2,
    r'''
    query example {
    ''',
  )
  Future<MyEntity<Object>> getExample2();
}

构建后会生成对应的部分文件 example_remote_source.gqlc.dart

part of 'example_remote_source.dart';

class _ExampleRemoteSource implements ExampleRemoteSource {
  const _ExampleRemoteSource(this._client);

  final GraphQLClient _client;

  static final _$getExample1Gql = gql(r'''
    query detailExample($id: String!) {
      detailExample(detailExampleInput: { exampleId: $id }) {
        id
        name
      }
    }
    ''');
  @override
  Future<MyEntity<Example>> getExample1(Map<String, dynamic> variables) {
    final QueryOptions<Example> options = QueryOptions<Example>(
      document: _$getExample1Gql,
      variables: variables,
      fetchPolicy: FetchPolicy.networkOnly,
      parserFn: Example.fromMap,
    );
    return _client.query(options).then(queryResultMapper);
  }

  static final _$getExample2Gql = gql(r'''
    query example {
    ''');
  @override
  Future<MyEntity<Object>> getExample2() {
    final MutationOptions<Example> options = MutationOptions<Example>(
      document: _$getExample2Gql,
      parserFn: Example.fromMap,
    );
    return _client.mutate(options).then(queryResultMapper2);
  }
}

示例代码 Example Code

以下是一个完整的示例代码:

// example/lib/example.dart
export 'src/example.dart';

更多关于Flutter GraphQL客户端代码生成插件graphql_client_gen的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter GraphQL客户端代码生成插件graphql_client_gen的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


graphql_client_gen 是一个用于 Flutter 的代码生成插件,它可以根据你的 GraphQL schema 和查询生成类型安全的 Dart 代码。这使得在使用 GraphQL API 时,能够获得更好的开发体验和类型安全性。

以下是如何在 Flutter 项目中使用 graphql_client_gen 插件的步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 graphql_client_genbuild_runner 作为开发依赖。

dependencies:
  flutter:
    sdk: flutter
  graphql_flutter: ^5.0.0  # 或者你正在使用的版本

dev_dependencies:
  build_runner: ^2.1.0
  graphql_client_gen: ^0.1.0  # 使用最新版本

2. 创建 GraphQL Schema 文件

你需要有一个 GraphQL schema 文件(通常是 .graphql.json 格式)。你可以通过以下方式获取 schema:

  • 从你的 GraphQL 服务器下载 schema:apollo schema:download --endpoint=http://your-graphql-endpoint/graphql schema.graphql
  • 或者使用现有的 schema 文件。

将 schema 文件放在项目的某个目录下,例如 lib/graphql/schema.graphql

3. 创建 GraphQL 查询文件

lib/graphql 目录下创建 .graphql 文件,定义你的查询、变更或订阅。例如:

# lib/graphql/queries/get_user.graphql
query GetUser($id: ID!) {
  user(id: $id) {
    id
    name
    email
  }
}

4. 配置 build.yaml

在项目根目录下创建一个 build.yaml 文件,配置 graphql_client_gen 插件:

targets:
  $default:
    builders:
      graphql_client_gen:
        options:
          schema: lib/graphql/schema.graphql
          output: lib/graphql/generated/

5. 生成代码

运行以下命令生成 Dart 代码:

flutter pub run build_runner build

这将根据你的 GraphQL schema 和查询文件生成类型安全的 Dart 代码,并输出到 lib/graphql/generated/ 目录。

6. 使用生成的代码

生成的代码将包含类型安全的查询、变更和订阅。你可以在你的 Flutter 应用中使用这些生成的代码来执行 GraphQL 操作。

import 'package:flutter/material.dart';
import 'package:graphql_flutter/graphql_flutter.dart';
import 'graphql/generated/get_user.graphql.dart';

void main() {
  final HttpLink httpLink = HttpLink('http://your-graphql-endpoint/graphql');
  final ValueNotifier<GraphQLClient> client = ValueNotifier(
    GraphQLClient(
      link: httpLink,
      cache: GraphQLCache(),
    ),
  );

  runApp(
    GraphQLProvider(
      client: client,
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('GraphQL Client Gen Example'),
        ),
        body: Query(
          options: QueryOptions(
            document: GET_USER_QUERY_DOCUMENT,
            variables: GetUserArguments(id: '1').toJson(),
          ),
          builder: (QueryResult result, {fetchMore, refetch}) {
            if (result.hasException) {
              return Text('Error: ${result.exception}');
            }

            if (result.isLoading) {
              return CircularProgressIndicator();
            }

            final user = result.data?['user'];
            return Text('User: ${user['name']}');
          },
        ),
      ),
    );
  }
}
回到顶部