Flutter GraphQL模式生成插件graphql_schema2的使用
Flutter GraphQL模式生成插件graphql_schema2的使用
标题
GraphQL Schema 2
内容
-
版本信息:
-
描述:
- Dart实现的GraphQL类型系统。支持任何Dart运行的平台。
- 设计决策旨在尽可能地与JavaScript参考实现保持一致,并正确实现官方规范。
-
功能:
- 支持所有GraphQL类型:
String
Int
Float
Boolean
GraphQLObjectType
GraphQLUnionType
GraphQLEnumType
GraphQLInputObjectType
Date
- ISO-8601日期字符串,反序列化为DartDateTime
对象
- 支持所有GraphQL类型:
-
使用示例:
- 使用辅助函数定义一个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
- 创建带有提供的innerType
的GraphQLListType
inputObjectType
- 创建GraphQLInputObjectType
inputField
- 创建GraphQLInputObjectType
的字段
-
类型:
- 所有的GraphQL标量类型都内置,还包括一个
Date
类型:
// 所有的GraphQL标量类型 graphQLString graphQLId graphQLBoolean graphQLInt graphQLFloat graphQLDate
- 所有的GraphQL标量类型都内置,还包括一个
-
非空类型:
- 可以通过调用类型的方法
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
更多关于Flutter GraphQL模式生成插件graphql_schema2的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用graphql_schema2
插件来生成GraphQL模式的代码示例。graphql_schema2
插件可以帮助你从GraphQL的Schema文件中生成Dart类型,便于在Flutter应用中更方便地使用GraphQL。
前提条件
- 确保你已经安装了Flutter和Dart环境。
- 确保你的项目已经创建并配置好。
步骤
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类型,并在应用中使用这些类型。