Flutter GraphQL重连插件gql_phoenix_link_2的使用

Flutter GraphQL重连插件gql_phoenix_link_2的使用

使用说明

gql_phoenix_link_2 是一个基于 Phoenix Channels 的实验性 GraphQL Link。它支持查询(queries)、变更(mutations)和订阅(subscriptions)。

信息

该插件替代了已废弃的 gql_phoenix_link 库(https://pub.dev/packages/gql_phoenix_link)。


完整示例 Demo

以下是一个完整的示例,展示如何在 Flutter 中使用 gql_phoenix_link_2 插件来实现 GraphQL 查询、变更和订阅。

1. 添加依赖

pubspec.yaml 文件中添加依赖:

dependencies:
  flutter:
    sdk: flutter
  graphql_flutter: ^5.0.0+1
  gql_phoenix_link_2: ^1.0.0

运行 flutter pub get 安装依赖。


2. 配置 Phoenix Channel 和 GraphQL Client

创建一个 Phoenix Channel 并将其与 GraphQL Client 结合使用。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: GraphQLExample(),
    );
  }
}

class GraphQLExample extends StatefulWidget {
  @override
  _GraphQLExampleState createState() => _GraphQLExampleState();
}

class _GraphQLExampleState extends State<GraphQLExample> {
  late ValueNotifier<GraphQLClient> client;

  @override
  void initState() {
    super.initState();

    // 创建 Phoenix Channel
    final channel = PhoenixChannel(
      "ws://localhost:4000/socket", // Phoenix WebSocket 地址
      "auth_token", // 认证令牌
    );

    // 创建 GraphQL Link
    final link = PhoenixLink(channel);

    // 创建 GraphQL Client
    client = ValueNotifier(
      GraphQLClient(
        link: link,
        cache: GraphQLCache(),
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("GraphQL Example"),
      ),
      body: Query(
        client: client.value,
        options: QueryOptions(
          document: gql("""
            query GetTodos {
              todos {
                id
                title
              }
            }
          """),
        ),
        builder: (QueryResult result, {fetchMore, refetch}) {
          if (result.isLoading) {
            return Center(child: CircularProgressIndicator());
          }

          if (result.hasException) {
            return Center(child: Text(result.exception.toString()));
          }

          return ListView.builder(
            itemCount: result.data?['todos'].length ?? 0,
            itemBuilder: (context, index) {
              final todo = result.data?['todos'][index];
              return ListTile(
                title: Text(todo['title']),
              );
            },
          );
        },
      ),
    );
  }
}

3. 代码解析

  • Phoenix Channel
    创建一个 PhoenixChannel 对象,指定 WebSocket 地址和认证令牌。

    final channel = PhoenixChannel(
      "ws://localhost:4000/socket",
      "auth_token",
    );
  • Phoenix Link
    PhoenixChannel 包装为 PhoenixLink,用于与 GraphQL 进行通信。

    final link = PhoenixLink(channel);
  • GraphQL Client
    使用 GraphQLClient 配置 GraphQL 客户端,并将 PhoenixLink 设置为链接。

    client = ValueNotifier(
      GraphQLClient(
        link: link,
        cache: GraphQLCache(),
      ),
    );
  • Query 操作
    使用 Query 小部件执行 GraphQL 查询。

    Query(
      client: client.value,
      options: QueryOptions(
        document: gql("""
          query GetTodos {
            todos {
              id
              title
            }
          }
        """),
      ),
      builder: (QueryResult result, {fetchMore, refetch}) {
        // 处理加载状态、异常和数据
      },
    )
1 回复

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


gql_phoenix_link_2 是一个用于 Flutter 的 GraphQL 插件,它基于 gql_linkphoenix_channels,允许你在 Flutter 应用中实现 GraphQL 的自动重连功能。这个插件特别适用于使用 Phoenix Channels 作为传输层的 GraphQL 服务。

安装

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

dependencies:
  gql_phoenix_link_2: ^1.0.0
  gql: ^0.13.0
  flutter:
    sdk: flutter

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

基本使用

  1. 创建 Phoenix Socket

    首先,你需要创建一个 PhoenixSocket 实例,用于与 Phoenix 服务器建立 WebSocket 连接。

    import 'package:phoenix_socket/phoenix_socket.dart';
    
    final phoenixSocket = PhoenixSocket(
      'ws://your-server.com/socket/websocket',
    );
  2. 创建 PhoenixLink

    使用 PhoenixSocket 创建 PhoenixLink 实例。PhoenixLinkgql_link 的一个实现,用于处理 GraphQL 请求。

    import 'package:gql_phoenix_link_2/gql_phoenix_link_2.dart';
    
    final phoenixLink = PhoenixLink(
      phoenixSocket,
      channelName: 'your_channel_name',
    );
  3. 创建 GraphQL Client

    使用 PhoenixLink 创建一个 GraphQLClient 实例。

    import 'package:gql_exec/gql_exec.dart';
    import 'package:gql_link/gql_link.dart';
    import 'package:gql_http_link/gql_http_link.dart';
    
    final client = GraphQLClient(
      link: phoenixLink,
      cache: GraphQLCache(),
    );
  4. 发送 GraphQL 请求

    现在你可以使用 GraphQLClient 发送 GraphQL 请求了。

    final query = gql('''
      query {
        yourQuery {
          field1
          field2
        }
      }
    ''');
    
    final result = await client.query(QueryOptions(document: query));
    
    if (result.hasException) {
      print('Error: ${result.exception}');
    } else {
      print('Data: ${result.data}');
    }

自动重连

gql_phoenix_link_2 的一个主要功能是自动重连。当 WebSocket 连接断开时,PhoenixSocket 会自动尝试重新连接。你不需要手动处理重连逻辑。

处理连接状态

你可以监听 PhoenixSocket 的连接状态来执行一些自定义逻辑。

phoenixSocket.status.listen((status) {
  print('Socket status: $status');
  if (status == PhoenixSocketStatus.open) {
    // 连接成功
  } else if (status == PhoenixSocketStatus.closed) {
    // 连接关闭
  }
});
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!