Flutter GraphQL代码生成插件gql_code_builder的使用

发布于 1周前 作者 vueper 来自 Flutter

Flutter GraphQL代码生成插件gql_code_builder的使用

概述

gql_code_builder 是一个用于 Dart 的代码生成工具,它能够将 *.graphql 文档和 SDL(Schema Definition Language)转换为有用的类。尽管其 API 目前还不稳定,但它是 package:gql_build 构建器的基础。

特性和问题报告

请在 issue tracker 提交功能请求和错误报告。

示例 Demo

以下是使用 gql_code_builder 生成 GraphQL 类的完整示例:

  1. 添加依赖项

首先,在 pubspec.yaml 文件中添加以下依赖项:

dependencies:
  gql: ^0.13.0
  gql_http_link: ^0.4.0
  gql_code_builder: ^0.2.0

dev_dependencies:
  build_runner: ^2.0.0
  1. 创建 GraphQL 查询文件

在项目中创建一个名为 queries.graphql 的文件,并定义您的 GraphQL 查询。例如:

# queries.graphql
query GetRepositories($n: Int!) {
  viewer {
    repositories(first: $n) {
      nodes {
        name
        description
      }
    }
  }
}
  1. 配置构建脚本

build.yaml 文件中配置 gql_code_builder,以便它可以处理 *.graphql 文件并生成相应的 Dart 类。

targets:
  $default:
    builders:
      gql_code_builder|gql_builder:
        options:
          schema_mapping:
            - schema: 'lib/schema.graphql'
              queries_glob: 'lib/queries/**.graphql'
              output: 'lib/generated/graphql_api.dart'

确保 schema.graphql 包含您的 GraphQL schema 定义。

  1. 运行构建器

使用 build_runner 运行构建器以生成代码:

flutter pub run build_runner build

这将生成一个包含查询类的 Dart 文件,例如 lib/generated/graphql_api.dart

  1. 使用生成的类

现在可以在您的 Flutter 应用程序中使用生成的类来执行 GraphQL 查询。例如:

import 'package:gql/apollo.dart';
import 'package:gql_http_link/gql_http_link.dart';
import 'package:flutter/material.dart';
import 'generated/graphql_api.dart'; // Generated file

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: GraphQLExample(),
    );
  }
}

class GraphQLExample extends StatefulWidget {
  [@override](/user/override)
  _GraphQLExampleState createState() => _GraphQLExampleState();
}

class _GraphQLExampleState extends State<GraphQLExample> {
  late Client client;

  [@override](/user/override)
  void initState() {
    super.initState();
    
    final link = HttpLink('https://api.github.com/graphql');
    client = Client(
      link: link,
      cache: Cache(), // Optional
    );
  }

  Future<void> fetchRepositories() async {
    final options = QueryOptions(
      document: GET_REPOSITORIES, // This is the generated query class
      variables: <String, dynamic>{'n': 5},
    );

    final result = await client.query(options);

    if (result.hasException) {
      print(result.exception.toString());
    } else {
      print(result.data);
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('GraphQL Example'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: fetchRepositories,
          child: Text('Fetch Repositories'),
        ),
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用gql_code_builder插件来生成GraphQL代码的示例。这个插件能够根据你的GraphQL查询和变更操作生成相应的Dart代码,从而简化与GraphQL API的交互。

1. 安装依赖

首先,你需要在你的pubspec.yaml文件中添加gql_code_builder及其相关依赖:

dependencies:
  flutter:
    sdk: flutter
  graphql: ^x.y.z  # 确保你使用的是最新版本的graphql库

dev_dependencies:
  build_runner: ^x.y.z  # 使用build_runner来运行代码生成命令
  gql_code_builder: ^x.y.z  # gql_code_builder插件
  gql: ^x.y.z  # gql库通常也是需要的

将上述x.y.z替换为实际版本号。

2. 定义GraphQL Schema

你需要在项目中定义一个GraphQL schema文件(例如schema.graphql),这个文件描述了你的GraphQL API的结构。示例:

# schema.graphql
schema {
  query: Query
}

type Query {
  user(id: ID!): User
}

type User {
  id: ID!
  name: String!
  email: String!
}

3. 定义GraphQL Operations

接下来,定义你的GraphQL操作(查询和变更),例如operations.graphql

# operations.graphql
query GetUser($id: ID!) {
  user(id: $id) {
    id
    name
    email
  }
}

4. 配置build.yaml

在你的项目根目录下创建一个build.yaml文件,用于配置gql_code_builder

targets:
  $default:
    builders:
      gql_code_builder:
        generate_for:
          - "**/*.graphql"
        options:
          schema: "schema.graphql"
          output: "lib/graphql_api/"

这个配置告诉gql_code_builder,根据schema.graphql和所有.graphql文件生成代码,并将生成的代码输出到lib/graphql_api/目录。

5. 运行代码生成

在终端中运行以下命令来生成代码:

flutter pub get
flutter pub run build_runner build

6. 使用生成的代码

生成代码后,你可以在lib/graphql_api/目录下找到相应的Dart文件。例如,对于GetUser查询,你可能会得到一个GetUser.data.dartGetUser.var.dart文件。

你可以在你的Flutter组件中使用这些生成的代码。例如:

import 'package:your_app/graphql_api/get_user.data.g.dart';
import 'package:your_app/graphql_api/get_user.var.g.dart';
import 'package:graphql_flutter/graphql_flutter.dart';

// 假设你有一个GraphQLClient实例
final GraphQLClient client = GraphQLClient(
  cache: InMemoryCache(),
  link: HttpLink(
    uri: 'https://your-graphql-endpoint.com/graphql',
  ),
);

void _fetchUserData(String userId) async {
  final OperationResult<GetUserData, GetUserVariables> result =
      await client.query(
        GetUser.operation(variables: GetUserVariables(id: userId)),
      );

  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}');
  } else if (result.hasErrors) {
    result.errors!.forEach((error) => print(error.message));
  }
}

这个示例展示了如何执行一个GraphQL查询并处理结果。

通过上述步骤,你应该能够在Flutter项目中成功使用gql_code_builder插件来生成GraphQL代码,并简化与GraphQL API的交互。

回到顶部