Flutter GraphQL模式生成插件graphql_schema2的使用

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

Flutter GraphQL模式生成插件graphql_schema2的使用

标题

GraphQL Schema 2

内容

  • 版本信息:

  • 描述:

    • Dart实现的GraphQL类型系统。支持任何Dart运行的平台。
    • 设计决策旨在尽可能地与JavaScript参考实现保持一致,并正确实现官方规范。
  • 功能:

    • 支持所有GraphQL类型:
      • String
      • Int
      • Float
      • Boolean
      • GraphQLObjectType
      • GraphQLUnionType
      • GraphQLEnumType
      • GraphQLInputObjectType
      • Date - ISO-8601日期字符串,反序列化为Dart DateTime对象
  • 使用示例:

    • 使用辅助函数定义一个schema:
    final GraphQLSchema todoSchema = GraphQLSchema(
        query: objectType('Todo', [
          field('text', graphQLString.nonNullable()),
          field('created_at', graphQLDate),
        ]));
    
    • 所有GraphQL类型都是泛型的,以利用Dart的强类型支持。
  • 序列化和反序列化:

    • GraphQL类型可以序列化和反序列化输入数据。具体实现取决于类型。
    var iso8601String = graphQLDate.serialize(DateTime.now());
    var date = graphQLDate.deserialize(iso8601String);
    print(date.millisecondsSinceEpoch);
    
  • 验证:

    • GraphQL类型可以验证输入数据。
    var validation = myType.validate('[@root](/user/root)', {...});
    
    if (validation.successful) {
      doSomething(validation.value);
    } else {
      print(validation.errors);
    }
    
  • 辅助函数:

    • graphQLSchema - 创建GraphQLSchema
    • objectType - 创建GraphQLObjectType带字段
    • field - 创建带有类型/参数/解析器的GraphQLField
    • listOf - 创建带有提供的innerTypeGraphQLListType
    • inputObjectType - 创建GraphQLInputObjectType
    • inputField - 创建GraphQLInputObjectType的字段
  • 类型:

    • 所有的GraphQL标量类型都内置,还包括一个Date类型:
    // 所有的GraphQL标量类型
    graphQLString
    graphQLId
    graphQLBoolean
    graphQLInt
    graphQLFloat
    graphQLDate
    
  • 非空类型:

    • 可以通过调用类型的方法nonNullable轻松使类型非空。
  • 列表类型:

    • 列表类型的支持也包括在内。使用listType助手方便。
    /// A non-nullable list of non-nullable integers
    listOf(graphQLInt.nonNullable()).nonNullable();
    
  • 输入值和参数:

    • 假设以下GraphQL查询:
    {
       anime {
         characters(title: "Hunter x Hunter") {
           name
           age
         }
       }
    }
    
    • 其对应的schema:
    type AnimeQuery {
      characters($title: String!): [Character!]
    }
    
    type Character {
      name: String
      age: Int
    }
    
    • 字段characters接受参数title。在package:graphql_schema2中,使用GraphQLFieldInput来重现这一点:
    final GraphQLObjectType queryType = objectType('AnimeQuery', fields: [
      field('characters',
        listOf(characterType.nonNullable()),
        inputs: [
          new GraphQLFieldInput('title', graphQLString.nonNullable())
        ]
      ),
    ]);
    
    final GraphQLObjectType characterType = objectType('Character', fields: [
      field('name', graphQLString),
      field('age', graphQLInt),
    ]);
    
    • 在大多数情况下,你将委托实际的数据检索给数据库对象或异步解析函数。

    • package:graphql_schema2 包含了这个功能在resolve属性中,该属性传递了一个上下文对象和一个Map<String, dynamic>的参数。

    • 假设的例子:

    var field = field(
      'characters',
      graphQLString,
      resolve: (_, args) async {
        return await myDatabase.findCharacters(args['title']);
      },
    );
    

示例代码

import 'package:graphql_schema2/graphql_schema2.dart';

final GraphQLSchema todoSchema = GraphQLSchema(
  queryType: objectType('Todo', fields: [
    field(
      'text',
      graphQLString.nonNullable(),
      resolve: resolveToNull,
    ),
    field(
      'created_at',
      graphQLDate,
      resolve: resolveToNull,
    ),
  ]),
);

void main() {
  // 验证
  var validation = todoSchema.queryType!.validate(
    '[@root](/user/root)',
    {
      'foo': 'bar',
      'text': null,
      'created_at': 24,
    },
  );

  if (validation.successful) {
    print('This is valid data!!!');
  } else {
    print('Invalid data.');
    for (var s in validation.errors) {
      print('  * $s');
    }
  }

  // 序列化
  print(todoSchema.queryType!.serialize({
    'text': 'Clean your room!',
    'created_at': DateTime.now().subtract(Duration(days: 10))
  }));
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用graphql_schema2插件来生成GraphQL模式的代码示例。graphql_schema2插件可以帮助你从GraphQL的Schema文件中生成Dart类型,便于在Flutter应用中更方便地使用GraphQL。

前提条件

  1. 确保你已经安装了Flutter和Dart环境。
  2. 确保你的项目已经创建并配置好。

步骤

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  graphql_schema2: ^x.y.z  # 请替换为最新版本号

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

2. 准备GraphQL Schema文件

假设你有一个GraphQL Schema文件schema.graphql,内容如下:

schema {
  query: Query
}

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

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

将这个文件放在你的项目目录中,例如assets/schemas/schema.graphql

3. 配置build.yaml

在你的项目根目录下创建或编辑build.yaml文件,配置graphql_schema2插件:

targets:
  $default:
    builders:
      graphql_schema2:
        options:
          schema_file: assets/schemas/schema.graphql
          output_file: lib/graphql_generated_types.dart

这里我们指定了Schema文件的位置和生成Dart文件的输出位置。

4. 运行生成命令

在项目根目录下运行以下命令来生成Dart类型文件:

flutter pub run build_runner build

这将读取你的GraphQL Schema文件并生成对应的Dart类型文件lib/graphql_generated_types.dart

5. 使用生成的类型

现在你可以在你的Flutter应用中使用生成的类型。例如,假设你有一个GraphQL查询来获取用户信息:

query GetUser($id: ID!) {
  user(id: $id) {
    id
    name
    email
  }
}

你可以像这样使用生成的类型:

import 'package:flutter/material.dart';
import 'lib/graphql_generated_types.dart';  // 导入生成的类型文件

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter GraphQL Schema2 Example'),
        ),
        body: Center(
          child: FutureBuilder<GetUserQueryData>(
            future: fetchUser('1'),  // 假设这是你的GraphQL查询函数
            builder: (context, snapshot) {
              if (snapshot.connectionState == ConnectionState.waiting) {
                return CircularProgressIndicator();
              } else if (snapshot.hasError) {
                return Text('Error: ${snapshot.error}');
              } else {
                final data = snapshot.data?.user;
                return data != null
                    ? Column(
                        mainAxisAlignment: MainAxisAlignment.center,
                        children: <Widget>[
                          Text('ID: ${data?.id}'),
                          Text('Name: ${data?.name}'),
                          Text('Email: ${data?.email}'),
                        ],
                      )
                    : Text('No user data');
              }
            },
          ),
        ),
      ),
    );
  }

  // 这是一个假设的GraphQL查询函数,你需要根据你的GraphQL客户端库来实现它
  Future<GetUserQueryData> fetchUser(String id) async {
    // 你的GraphQL查询逻辑
    // 例如,使用Apollo Client、graphql-flutter等库
    // 这里仅作为示例,返回一个模拟数据
    return GetUserQueryData(
      __(alias: null)..user = User(
        __(alias: null)..id = id,
        __(alias: null)..name = 'John Doe',
        __(alias: null)..email = 'john.doe@example.com',
      ),
    );
  }
}

注意:上面的fetchUser函数是一个假设的实现,你需要根据你的GraphQL客户端库(如Apollo Client、graphql-flutter等)来实现实际的查询逻辑。

通过上述步骤,你已经成功地在Flutter项目中使用graphql_schema2插件生成了GraphQL模式的Dart类型,并在应用中使用这些类型。

回到顶部