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
更多关于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_gen 和 build_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']}');
},
),
),
);
}
}

