Flutter GraphQL查询插件gql的使用

Flutter GraphQL查询插件gql的使用

gql 是一个用于处理 GraphQL 文档的 Dart 包,特别适用于 Flutter 应用。它提供了解析、打印和操作 GraphQL AST(抽象语法树)的功能。下面将详细介绍如何在 Flutter 项目中使用 gql 插件进行 GraphQL 查询。

安装依赖

首先,在你的 pubspec.yaml 文件中添加 gql 相关的依赖:

dependencies:
  gql: ^0.13.0
  gql_http_link: ^0.4.0

然后运行 flutter pub get 来安装这些包。

解析 GraphQL 文档

package:gql/language.dart 提供了将 GraphQL 字符串解析为 AST 的功能,并可以将 AST 打印回字符串。

示例代码:解析 GraphQL 查询

import 'package:gql/language.dart' as lang;
import 'package:gql/ast.dart' as ast;

void main() {
  final ast.DocumentNode doc = lang.parseString(
    r"""
      query UserInfo($id: ID!) {
        user(id: $id) {
          id
          name
        }
      }
    """,
  );

  print((doc.definitions.first as ast.OperationDefinitionNode).name.value); // prints "UserInfo"
}

打印 GraphQL AST 到字符串

你可以将解析后的 AST 再次转换为字符串以便调试或进一步处理。

示例代码:打印 AST

import 'package:gql/ast.dart' as ast;
import 'package:gql/language.dart' as lang;

void main() {
  print(
    lang.printNode(
      const ast.SchemaDefinitionNode(
        operationTypes: [
          ast.OperationTypeDefinitionNode(
            operation: ast.OperationType.query,
            type: ast.NamedTypeNode(
              name: ast.NameNode(value: "MyQuery"),
              isNonNull: false,
            ),
          )
        ],
      ),
    ),
  );
  // prints
  // "schema {
  //   query: MyQuery
  // }"
}

访问和转换 GraphQL AST 节点

package:gql/ast.dart 提供了访问和转换 AST 节点的能力。

示例代码:访问节点

import 'package:gql/ast.dart' as ast;
import 'package:gql/language.dart' as lang;

class TypeVisitor extends ast.RecursiveVisitor {
  Iterable<ast.ObjectTypeDefinitionNode> types = [];

  @override
  visitObjectTypeDefinitionNode(ast.ObjectTypeDefinitionNode node) {
    types = types.followedBy([node]);
    super.visitObjectTypeDefinitionNode(node);
  }
}

void main() {
  final ast.DocumentNode doc = lang.parseString("""
    type A { id: ID! }
    type B { id: ID! }
    type C { id: ID! }
    type D { id: ID! }
    type E { id: ID! }
    """);

  final TypeVisitor v = TypeVisitor();

  doc.accept(v);

  print(
    v.types.map((t) => t.name.value).join("\n"),
  );
  // prints
  // "A
  // B
  // C
  // D
  // E"
}

示例代码:转换节点

import 'package:gql/ast.dart' as ast;
import 'package:gql/language.dart' as lang;

class AddTypenames extends ast.TransformingVisitor {
  @override
  ast.FieldNode visitFieldNode(ast.FieldNode node) {
    if (node.selectionSet == null) {
      return node;
    }

    return ast.FieldNode(
      name: node.name,
      alias: node.alias,
      arguments: node.arguments,
      directives: node.directives,
      selectionSet: ast.SelectionSetNode(
        selections: <ast.SelectionNode>[
          ast.FieldNode(
            name: ast.NameNode(value: "__typename"),
          ),
          ...node.selectionSet.selections
        ],
      ),
    );
  }
}

void main() {
  final ast.DocumentNode doc = lang.parseString(
    r"""
      query UserInfo($id: ID!, $articleId: ID!) {
        user(id: $id) {
          id
          name
        }
        post(id: $articleId) {
          id
          title
          description
        }
      }
    """,
  );

  final ast.DocumentNode withTypenames = ast.transform(
    doc,
    [
      AddTypenames(),
    ],
  );

  print(lang.printNode(withTypenames));
  // prints
  // "query UserInfo($id: ID!, $articleId: ID!) {
  //   user(id: $id) {
  //     __typename
  //     id
  //     name
  //   }
  //   post(id: $articleId) {
  //     __typename
  //     id
  //     title
  //     description
  //   }
  // }"
}

实际应用:执行 GraphQL 查询

为了实际执行 GraphQL 查询,我们需要设置 HTTP 链接并发送请求。

示例代码:执行查询

import 'package:gql_http_link/gql_http_link.dart';
import 'package:gql_exec/gql_exec.dart';
import 'package:gql/language.dart' as lang;

void main() async {
  final link = HttpLink('https://your-graphql-endpoint.com/graphql');

  final query = lang.parseString(r'''
    query UserInfo($id: ID!) {
      user(id: $id) {
        id
        name
      }
    }
  ''');

  final request = Request(
    operation: Operation(document: query, variables: {'id': '1'}),
    context: Context(),
  );

  final response = await link.request(request).first;

  if (response.data != null) {
    print(response.data);
  } else {
    print(response.errors);
  }
}

通过上述步骤,你可以在 Flutter 应用中轻松集成和使用 gql 进行 GraphQL 查询。希望这个示例能帮助你快速上手!


更多关于Flutter GraphQL查询插件gql的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


当然,以下是一个关于如何在Flutter应用中使用gql插件来进行GraphQL查询的示例代码。这个示例展示了如何配置客户端、执行查询并处理结果。

首先,确保你的pubspec.yaml文件中已经添加了gqlgraphql_flutter依赖:

dependencies:
  flutter:
    sdk: flutter
  gql: ^0.13.0  # 请检查最新版本
  graphql_flutter: ^5.0.0  # 请检查最新版本

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

接下来,设置GraphQL客户端和查询。

1. 定义GraphQL查询

创建一个文件queries.dart来定义你的GraphQL查询:

import 'package:gql/ast.dart';

final String query = r'''
  query GetUser($id: ID!) {
    user(id: $id) {
      id
      name
      email
    }
  }
''';

final DocumentNode operationDocument = parseString(query);

class GetUserArguments extends JsonSerializable {
  final String id;

  GetUserArguments({required this.id});

  factory GetUserArguments.fromJson(Map<String, dynamic> json) =>
      _$GetUserArgumentsFromJson(json);

  Map<String, dynamic> toJson() => _$GetUserArgumentsToJson(this);
}

class GetUserData {
  final String? id;
  final String? name;
  final String? email;

  GetUserData({this.id, this.name, this.email});

  factory GetUserData.fromJson(Map<String, dynamic> json) {
    return GetUserData(
      id: json['id'] as String?,
      name: json['name'] as String?,
      email: json['email'] as String?,
    );
  }
}

class GetUserResult extends JsonSerializable {
  final GetUserData? user;

  GetUserResult({this.user});

  factory GetUserResult.fromJson(Map<String, dynamic> json) =>
      _$GetUserResultFromJson(json);

  Map<String, dynamic> toJson() => _$GetUserResultToJson(this);
}

2. 配置GraphQL客户端

创建一个文件client.dart来配置你的GraphQL客户端:

import 'package:gql/gql.dart';
import 'package:graphql_flutter/graphql_flutter.dart';
import 'queries.dart';

ValueNotifier<GraphQLClient> initializeApolloClient() {
  final HttpLink httpLink = HttpLink(
    uri: 'https://your-graphql-endpoint.com/graphql', // 替换为你的GraphQL服务端点
  );

  final ValueNotifier<GraphQLClient> client = ValueNotifier(
    GraphQLClient(
      cache: InMemoryCache(),
      link: httpLink,
    ),
  );

  return client;
}

3. 使用GraphQL客户端进行查询

在你的Flutter组件中使用上述配置和查询:

import 'package:flutter/material.dart';
import 'package:graphql_flutter/graphql_flutter.dart';
import 'client.dart';
import 'queries.dart';

void main() {
  final ValueNotifier<GraphQLClient> client = initializeApolloClient();
  runApp(MyApp(client: client));
}

class MyApp extends StatelessWidget {
  final ValueNotifier<GraphQLClient> client;

  MyApp({required this.client});

  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ValueListenableProvider.value(value: client),
      ],
      child: MaterialApp(
        home: MyHomePage(),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final _controller = TextEditingController();

  @override
  Widget build(BuildContext context) {
    final client = context.watch<GraphQLClient>();

    return Scaffold(
      appBar: AppBar(
        title: Text('GraphQL Flutter Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            TextField(
              controller: _controller,
              decoration: InputDecoration(labelText: 'User ID'),
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: () async {
                final GetUserArguments args = GetUserArguments(id: _controller.text);
                final OperationResult<GetUserResult, GetUserArguments> result =
                    await client.query(
                  QueryOptions(
                    document: operationDocument,
                    variables: args.toJson(),
                  ),
                );

                if (result.hasException) {
                  print(result.exception?.toString() ?? 'No exception message');
                } else if (result.data?.user != null) {
                  print('User ID: ${result.data!.user!.id}');
                  print('User Name: ${result.data!.user!.name}');
                  print('User Email: ${result.data!.user!.email}');
                }
              },
              child: Text('Fetch User'),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,它允许用户输入一个用户ID,并通过GraphQL查询获取该用户的信息。查询结果会在控制台中打印出来。

确保将https://your-graphql-endpoint.com/graphql替换为你的实际GraphQL服务端点。这个示例展示了如何使用gql插件来配置客户端、定义查询并在Flutter应用中执行查询。

回到顶部