Flutter GraphQL客户端插件graphql_client_flutter的使用
Flutter GraphQL客户端插件graphql_client_flutter的使用
标题
GraphQL Client Flutter
内容
A powerful, flexible, and feature-rich GraphQL client for Flutter applications. Simplify interactions with GraphQL APIs with built-in caching, error handling, real-time subscriptions, batch operations, and more.
- Flutter: Flutter Logo
- Dart: Dart Logo
- Pub Version:
- License:
- CI:
目录
- 特性
- 安装
- 开始使用
- 使用
- 配置客户端
- 执行查询
- 执行突变
- 订阅
- 批量操作
- 缓存管理
- 错误处理
- 高级配置
- 自定义拦截器
- 重试逻辑
- 日志选项
- 测试
- 贡献
- 许可证
- 补充信息
特性
- 全GraphQL支持
- 精湛地处理查询、突变和订阅。
- 高级缓存
- 多种缓存策略(例如,网络优先、缓存优先)。
- 内存和持久存储选项。
- 支持缓存条目的时间到活(TTL)。
- 内置重试机制
- 可配置的重试尝试次数和延迟。
- 指数退避策略。
- 强大的错误处理
- 详细的错误信息带堆栈跟踪。
- 可定制的错误处理策略。
- 全面的日志记录
- 请求和 响应日志。
- GraphQL查询和JSON数据的漂亮打印。
- 批量操作
- 在单个网络请求中执行多个操作。
- 订阅支持
- 实时数据更新通过WebSocket订阅。
- 干净架构
- 设计用于维护和测试。
安装
在项目 pubspec.yaml
文件中添加依赖项:
dependencies:
graphql_client_flutter: ^1.0.0
然后运行:
dart pub get
开始使用
要开始使用 graphql_client_flutter
,您需要配置客户端以连接到您的GraphQL API端点。
示例
import 'package:graphql_client_flutter/graphql_client_flutter.dart';
void main() async {
// 创建客户端配置
final config = GraphQLConfig(
endpoint: 'https://api.example.com/graphql',
subscriptionEndpoint: 'wss://api.example.com/graphql',
defaultCachePolicy: CachePolicy.cacheFirst,
defaultTimeout: Duration(seconds: 30),
enableLogging: true,
maxRetries: 3,
retryDelay: Duration(seconds: 1),
defaultHeaders: {
'Authorization': 'Bearer YOUR_TOKEN',
},
);
// 初始化客户端
final client = GraphQLClientBase(config: config);
// 使用客户端执行操作
}
配置客户端
首先,导入包并创建一个配置:
import 'package:graphql_client_flutter/graphql_client_flutter.dart';
void main() async {
// 创建客户端配置
final config = GraphQLConfig(
endpoint: 'https://api.example.com/graphql',
subscriptionEndpoint: 'wss://api.example.com/graphql',
defaultCachePolicy: CachePolicy.cacheFirst,
defaultTimeout: Duration(seconds: 30),
enableLogging: true,
maxRetries: 3,
retryDelay: Duration(seconds: 1),
defaultHeaders: {
'Authorization': 'Bearer YOUR_TOKEN',
},
);
// 初始化客户端
final client = GraphQLClientBase(config: config);
// ... 使用客户端
}
执行查询
使用 query
方法执行GraphQL查询:
final response = await client.query<Map<String, dynamic>>(
'''
query GetUsers(\$limit: Int) {
users(limit: \$limit) {
id
name
email
}
}
''',
variables: {'limit': 10},
cachePolicy: CachePolicy.cacheAndNetwork,
ttl: Duration(minutes: 10),
);
if (response.hasErrors) {
print('Errors: ${response.errors}');
} else {
print('Users: ${response.data?['users']}');
}
执行突变
使用 mutate
方法执行GraphQL突变:
final response = await client.mutate<Map<String, dynamic>>(
'''
mutation CreateUser(\$input: CreateUserInput!) {
createUser(input: \$input) {
id
name
email
}
}
''',
variables: {
'input': {
'name': 'Jane Doe',
'email': 'jane@example.com',
},
},
invalidateCache: ['GetUsers'], // 指定要失效的查询
);
if (response.hasErrors) {
print('Errors: ${response.errors}');
} else {
print('Created User: ${response.data?['createUser']}');
}
订阅
订阅实时数据使用 subscribe
方法:
final subscription = client.subscribe<Map<String, dynamic>>(
'''
subscription OnNewUser {
userCreated {
id
name
email
}
}
''',
).listen(
(response) {
print('New User: ${response.data?['userCreated']}');
},
onError: (error) {
print('Subscription error: $error');
},
);
// 记得在完成时取消订阅
await subscription.cancel();
批量操作
使用 batch
方法执行多个操作在一个网络请求中:
final batchResponse = await client.batch([
BatchOperation(
query: '''
query GetUser(\$id: ID!) {
user(id: \$id) {
id
name
}
}
''',
variables: {'id': '1'},
),
BatchOperation(
query: '''
mutation UpdateUser(\$id: ID!, \$input: UpdateUserInput!) {
updateUser(id: \$id, input: \$input) {
id
name
email
}
}
''',
variables: {
'id': '1',
'input': {'name': 'Updated Name'},
},
),
]);
// 访问单独的响应
final getUserResponse = batchResponse.responses[0];
final updateUserResponse = batchResponse.responses[1];
缓存管理
使用提供的方法管理缓存:
// 清除整个缓存
await client.clearCache();
// 效应特定查询
await client.invalidateQueries(['GetUsers', 'GetUser']);
// 获取缓存统计信息
final stats = await client.getCacheStats();
print('Cache Stats: $stats');
错误处理
优雅地处理错误:
try {
final response = await client.query('your query');
if (response.hasErrors) {
// 处理GraphQL错误
for (final error in response.errors!) {
print('Error: ${error.message}');
}
} else {
// 使用响应数据
}
} on GraphQLException catch (e) {
// 处理由客户端抛出的异常
print('GraphQL Exception: ${e.message}');
} catch (e) {
// 处理其他异常
print('General Exception: $e');
}
高级配置
自定义拦截器
您可以提供自定义拦截器来扩展客户端的功能:
final client = GraphQLClientBase(
config: config,
interceptors: [
MyCustomInterceptor(),
// 添加其他拦截器
],
);
重试逻辑
配置失败请求的重试行为:
final config = GraphQLConfig(
endpoint: 'https://api.example.com/graphql',
maxRetries: 5,
retryDelay: Duration(seconds: 2),
// 选项性地提供一个自定义 shouldRetry 函数
);
日志选项
精细调整日志设置使用 LoggingInterceptor
:
final client = GraphQLClientBase(
config: config,
interceptors: [
LoggingInterceptor(
options: LoggingOptions(
logRequests: true,
logResponses: true,
logErrors: true,
),
prettyPrintJson: true,
),
],
);
测试
此包包括全面的测试以确保可靠性和正确性。要运行测试,请使用以下命令:
dart test test/graphql_client_test.dart
确保已安装必要的开发依赖项,如指定在 pubspec.yaml
中:
更多关于Flutter GraphQL客户端插件graphql_client_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter GraphQL客户端插件graphql_client_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个使用 graphql_client_flutter
插件在 Flutter 应用中进行 GraphQL 查询的示例代码。这个示例假设你已经有一个 GraphQL 服务器在运行,并且你知道如何定义你的查询和变量。
首先,确保在你的 pubspec.yaml
文件中添加 graphql_flutter
和 graphql
依赖:
dependencies:
flutter:
sdk: flutter
graphql_flutter: ^5.0.0 # 请检查最新版本
graphql: ^5.0.0 # 请检查最新版本
然后,运行 flutter pub get
来获取这些依赖。
接下来,创建一个 Flutter 应用,并在其中设置 GraphQL 客户端。以下是一个完整的示例,包括定义查询、创建客户端、以及在 Flutter UI 中使用查询结果。
main.dart
import 'package:flutter/material.dart';
import 'package:graphql_flutter/graphql_flutter.dart';
import 'package:graphql/client.dart';
// 定义你的 GraphQL 查询
const String query = r'''
query GetUser($id: ID!) {
user(id: $id) {
id
name
email
}
}
''';
void main() {
// 创建 GraphQL 客户端
final HttpLink httpLink = HttpLink(
uri: 'https://your-graphql-endpoint.com/graphql', // 替换为你的 GraphQL 端点
);
final ValueNotifier<GraphQLClient> client = ValueNotifier(
GraphQLClient(
link: httpLink,
cache: NormalizedInMemoryCache(),
),
);
runApp(GraphQLProvider(
client: client,
child: MyApp(),
));
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Flutter GraphQL Client'),
),
body: Center(
child: UserQuery(userId: '1'),
),
),
);
}
}
class UserQuery extends StatefulWidget {
final String userId;
UserQuery({required this.userId});
@override
_UserQueryState createState() => _UserQueryState();
}
class _UserQueryState extends State<UserQuery> {
late QueryResult result;
@override
void initState() {
super.initState();
executeQuery();
}
Future<void> executeQuery() async {
final QueryOptions options = QueryOptions(
document: gql(query),
variables: <String, dynamic>{'id': widget.userId},
);
result = await GraphQLProvider.of(context).value.query(options);
if (result.hasException) {
print(result.exception!);
}
setState(() {});
}
@override
Widget build(BuildContext context) {
if (result.loading) {
return CircularProgressIndicator();
}
if (result.hasException) {
return Text('Error: ${result.exception!.message}');
}
if (result.data == null) {
return Text('No data');
}
final Map<String, dynamic> user = result.data!['user'] as Map<String, dynamic>;
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('ID: ${user['id']}'),
Text('Name: ${user['name']}'),
Text('Email: ${user['email']}'),
],
);
}
}
解释
-
依赖项:在
pubspec.yaml
中添加graphql_flutter
和graphql
依赖项。 -
GraphQL 客户端:在
main.dart
文件中,创建一个HttpLink
实例来连接到你的 GraphQL 服务器,并使用NormalizedInMemoryCache
作为缓存。然后,创建一个GraphQLClient
实例,并用ValueNotifier
包装它,以便在应用中共享。 -
GraphQL 提供者:使用
GraphQLProvider
组件来提供GraphQLClient
实例给你的 Flutter 应用。 -
查询组件:创建一个
UserQuery
组件,它接受一个userId
参数,并在initState
方法中执行 GraphQL 查询。查询结果存储在result
变量中,并在 UI 中显示。 -
UI 更新:根据查询的状态(加载中、有异常、无数据或有数据),显示不同的 UI 元素。
这个示例展示了如何在 Flutter 应用中使用 graphql_client_flutter
插件进行基本的 GraphQL 查询。你可以根据需要扩展这个示例,例如处理更多类型的查询和变更,以及添加错误处理和重试逻辑。