Flutter GraphQL客户端插件graphql_switch的使用

Flutter GraphQL客户端插件graphql_switch的使用

GraphQL Switch

GraphQL Switch 是一个受 Relay 启发的 GraphQL 框架。

import "flutter_hooks/flutter_hooks.dart";
import "graphql_switch/graphql_switch.dart";
import "./MyWidgetQuery.graphql.dart";
import "./MyWidgetAvatarFragment.graphql.dart";

class MyWidget extends HookWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
      // 使用 useQuery$MyWidgetQuery 钩子查询数据
      const data = useQuery$MyWidgetQuery(
          graphql("""
          query MyWidgetQuery {
              person {
                  name
                  age
                  avatar {
                      ...MyWidgetAvatar
                  }
              }
          }
          """)
      );

      return Row(
          children: [
              // 显示头像组件
              MyWidgetAvatar(
                  data.person.avatar
              ),
              // 显示姓名和年龄
              Text("${data.person.name} (age ${data.person.age})"),
          ]
      );
  }
}

class MyWidgetAvatar extends HookWidget {
  // 定义头像片段的键
  final MyWidgetAvatarFragment$key avatarKey;

  const MyWidgetAvatar(this.avatarKey);

  [@override](/user/override)
  Widget build(BuildContext context) {
      // 使用 useFragment$MyWidgetAvatarFragment 钩子获取头像片段数据
      const data = useFragment$MyWidgetAvatarFragment(
          graphql("""
              fragment MyWidgetAvatarFragment on Avatar {
                  url
              }
          """),
      );
      return Image.network(data.url);
  }
}

class MaybeMyWidgetAvatar extends HookWidget {
  // 可能为空的头像片段的键
  final MaybeMyWidgetAvatarFragment$key? avatarKey;

  const MaybeMyWidgetAvatar(this.avatarKey);

  [@override](/user/override)
  Widget build(BuildContext context) {
      // 使用 useFragment$MaybeMyWidgetAvatarFragment 钩子获取头像片段数据
      const data = useFragment$MaybeMyWidgetAvatarFragment(
          graphql("""
          fragment MaybeMyWidgetAvatarFragment on Avatar {
              url
          }
          """),
      );
      final url = data?.url;
      if (url == null) {
          return Text('No image');
      }
      return Image.network(url);
  }
}

Dart 代码分析

  • 查找 graphql(...) 来自 package:graphql_switch 并生成钩子。
  • 将生成的文件与 Dart 文件放置在一起。
  • (?)假设每个文件内的操作/片段名称唯一,并在不一致时抛出错误。
  • (?)对于片段,从可空键生成可空输出,从可迭代键生成可迭代输出。

GraphQL 代码分析

  • 通常遵循 graphql_codegen 的序列化器,对片段进行特殊处理。
    • 为字段和具体类型添加序列化器。
  • 而不是展开片段,使序列化器实现 $key 接口。
  • 其他片段也不应展开子片段的字段。

Linting

  • 通过 lint 强制执行操作(和片段)的命名,使其可选。
  • 检查字段是否在组件中使用并进行 lint。

完整示例

example/lib/main.dart

import 'package:flutter/material.dart';
import 'package:your_package_name/graphql_switch/graphql_switch.dart'; // 替换为实际的包名

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: MyWidget(), // 使用你定义的 MyWidget 组件
        ),
      ),
    );
  }
}

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

1 回复

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


graphql_switch 是一个 Flutter 插件,用于在 Flutter 应用中轻松切换不同的 GraphQL 客户端。这个插件特别适用于需要根据不同的环境(如开发、测试、生产)或不同的用户角色来切换 GraphQL 客户端的场景。

安装

首先,你需要在 pubspec.yaml 文件中添加 graphql_switch 依赖:

dependencies:
  flutter:
    sdk: flutter
  graphql_switch: ^1.0.0  # 请根据实际情况使用最新版本

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

基本用法

  1. 导入包

    在你的 Dart 文件中导入 graphql_switch

    import 'package:graphql_switch/graphql_switch.dart';
    
  2. 创建 GraphQL 客户端

    你可以使用 graphql_flutter 或其他 GraphQL 客户端库来创建不同的 GraphQL 客户端。例如:

    import 'package:graphql_flutter/graphql_flutter.dart';
    
    final client1 = GraphQLClient(
      cache: GraphQLCache(),
      link: HttpLink('https://api1.example.com/graphql'),
    );
    
    final client2 = GraphQLClient(
      cache: GraphQLCache(),
      link: HttpLink('https://api2.example.com/graphql'),
    );
    
  3. 配置 GraphQLSwitch

    使用 GraphQLSwitch 来管理这些客户端,并根据需要切换:

    final graphQLSwitch = GraphQLSwitch(
      clients: {
        'client1': client1,
        'client2': client2,
      },
      defaultClientId: 'client1',  // 设置默认客户端
    );
    
  4. 切换客户端

    你可以通过 switchClient 方法来切换客户端:

    graphQLSwitch.switchClient('client2');
    
  5. 使用当前客户端

    你可以通过 currentClient 属性来获取当前使用的客户端:

    final currentClient = graphQLSwitch.currentClient;
    
  6. 执行 GraphQL 查询

    使用当前客户端执行 GraphQL 查询或变更:

    final query = '''
      query {
        exampleQuery {
          field
        }
      }
    ''';
    
    final result = await currentClient.query(QueryOptions(
      document: gql(query),
    ));
    
    if (result.hasException) {
      print(result.exception);
    } else {
      print(result.data);
    }
    

示例

以下是一个完整的示例,展示了如何使用 graphql_switch 来切换不同的 GraphQL 客户端:

import 'package:flutter/material.dart';
import 'package:graphql_switch/graphql_switch.dart';
import 'package:graphql_flutter/graphql_flutter.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'GraphQL Switch Demo',
      home: GraphQLSwitchDemo(),
    );
  }
}

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

class _GraphQLSwitchDemoState extends State<GraphQLSwitchDemo> {
  final graphQLSwitch = GraphQLSwitch(
    clients: {
      'client1': GraphQLClient(
        cache: GraphQLCache(),
        link: HttpLink('https://api1.example.com/graphql'),
      ),
      'client2': GraphQLClient(
        cache: GraphQLCache(),
        link: HttpLink('https://api2.example.com/graphql'),
      ),
    },
    defaultClientId: 'client1',
  );

  String? selectedClientId = 'client1';

  Future<void> _fetchData() async {
    final query = '''
      query {
        exampleQuery {
          field
        }
      }
    ''';

    final result = await graphQLSwitch.currentClient.query(QueryOptions(
      document: gql(query),
    ));

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('GraphQL Switch Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            DropdownButton<String>(
              value: selectedClientId,
              onChanged: (String? newValue) {
                setState(() {
                  selectedClientId = newValue;
                  graphQLSwitch.switchClient(newValue!);
                });
              },
              items: <String>['client1', 'client2']
                  .map<DropdownMenuItem<String>>((String value) {
                return DropdownMenuItem<String>(
                  value: value,
                  child: Text(value),
                );
              }).toList(),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _fetchData,
              child: Text('Fetch Data'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部