Flutter GraphQL客户端插件graphql_client_flutter的使用

发布于 1周前 作者 yibo5220 来自 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.

目录

  1. 特性
  2. 安装
  3. 开始使用
  4. 使用
    • 配置客户端
    • 执行查询
    • 执行突变
    • 订阅
    • 批量操作
    • 缓存管理
    • 错误处理
  5. 高级配置
    • 自定义拦截器
    • 重试逻辑
    • 日志选项
  6. 测试
  7. 贡献
  8. 许可证
  9. 补充信息

特性

  • 全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

1 回复

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


当然,以下是一个使用 graphql_client_flutter 插件在 Flutter 应用中进行 GraphQL 查询的示例代码。这个示例假设你已经有一个 GraphQL 服务器在运行,并且你知道如何定义你的查询和变量。

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

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']}'),
      ],
    );
  }
}

解释

  1. 依赖项:在 pubspec.yaml 中添加 graphql_fluttergraphql 依赖项。

  2. GraphQL 客户端:在 main.dart 文件中,创建一个 HttpLink 实例来连接到你的 GraphQL 服务器,并使用 NormalizedInMemoryCache 作为缓存。然后,创建一个 GraphQLClient 实例,并用 ValueNotifier 包装它,以便在应用中共享。

  3. GraphQL 提供者:使用 GraphQLProvider 组件来提供 GraphQLClient 实例给你的 Flutter 应用。

  4. 查询组件:创建一个 UserQuery 组件,它接受一个 userId 参数,并在 initState 方法中执行 GraphQL 查询。查询结果存储在 result 变量中,并在 UI 中显示。

  5. UI 更新:根据查询的状态(加载中、有异常、无数据或有数据),显示不同的 UI 元素。

这个示例展示了如何在 Flutter 应用中使用 graphql_client_flutter 插件进行基本的 GraphQL 查询。你可以根据需要扩展这个示例,例如处理更多类型的查询和变更,以及添加错误处理和重试逻辑。

回到顶部