Flutter GraphQL与ActionCable集成插件graphql_action_cable_link的使用

发布于 1周前 作者 phonegap100 来自 Flutter

Flutter GraphQL与ActionCable集成插件graphql_action_cable_link的使用

graphql_action_cable_link

GraphQL Action Cable Link


一个用于GraphQL订阅的链接。此插件仅适用于使用graphql-ruby和ActionCable实现订阅的Rails服务器。

安装

首先,依赖于该包:

dependencies:
  graphql_action_cable_link:

使用

确保你的GraphQL订阅由ActionCable支持,详细信息可以查看 GraphQL Ruby 文档

基本用法

final graphqlEndpoint = 'http://localhost:3333/graphql';
final webSocketUrl = 'ws://localhost:3333/cable';
final actionCableLink = ActionCableLink(webSocketUrl);
final httpLink = HttpLink(graphqlEndpoint);

// 创建一个分割链接
final link = Link.split(
  (request) => request.isSubscription, // 判断请求是否为订阅
  actionCableLink,
  httpLink,
);

final graphqlClient = GraphQLClient(
  cache: GraphQLCache(),
  link: link,
);

设置默认头信息

类似于HttpLinkActionCableLink也支持设置默认头信息:

final actionCableLink = ActionCableLink(webSocketUrl, defaultHeaders: { 'x-time-zone': 'Australia/Sydney' });

支持认证头信息

ActionCableLink还支持通过提供返回token的函数来设置认证头信息:

String getAuthToken() {
  return 'Bearer auth-token';
}

final actionCableLink = ActionCableLink(
  webSocketUrl,
  getAuthTokenFunc: getAuthToken,
);

final httpLink = HttpLink(graphqlEndpoint);
final authLink = AuthLink(getToken: getAuthToken);
final link = Link.split(
  (request) => request.isSubscription, // 判断请求是否为订阅
  actionCableLink,
  authLink.concat(httpLink), // 将认证链接和HTTP链接合并
);

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中集成并使用graphql_action_cable_link插件来进行GraphQL与ActionCable集成的示例代码。这个插件允许你通过ActionCable订阅GraphQL订阅,并在Flutter应用中实时接收更新。

首先,确保你已经在pubspec.yaml文件中添加了graphql_fluttergraphql_action_cable_link依赖:

dependencies:
  flutter:
    sdk: flutter
  graphql_flutter: ^x.y.z  # 替换为最新版本号
  graphql_action_cable_link: ^a.b.c  # 替换为最新版本号

然后,运行flutter pub get来获取这些依赖。

接下来,你需要配置ActionCable连接和GraphQL订阅。以下是一个完整的示例,包括设置ActionCable、创建GraphQL客户端以及订阅数据:

import 'package:flutter/material.dart';
import 'package:graphql_flutter/graphql_flutter.dart';
import 'package:graphql_action_cable_link/graphql_action_cable_link.dart';
import 'dart:convert';

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

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final String actionCableUrl = 'wss://your-action-cable-server-url';
  final String subscriptionQuery = r'''
    subscription {
      someDataUpdate {
        id
        value
      }
    }
  ''';

  ValueNotifier<Map<String, dynamic>> subscriptionData = ValueNotifier({});

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

  void setupGraphQLClient() async {
    // 创建ActionCable Link
    var actionCableLink = ActionCableLink(
      url: actionCableUrl,
      subscriptions: [
        SubscriptionOptions(
          query: subscriptionQuery,
          onData: (result) {
            // 更新订阅数据
            var updatedData = Map<String, dynamic>.from(subscriptionData.value);
            updatedData['someDataUpdate'] = result['data']['someDataUpdate'];
            subscriptionData.value = updatedData;
          },
          onError: (error) {
            print('Subscription error: $error');
          },
          onCompleted: () {
            print('Subscription completed');
          },
        ),
      ],
    );

    // 创建GraphQL客户端
    var client = ValueNotifier<GraphQLClient>(
      GraphQLClient(
        link: actionCableLink,
        cache: GraphQLCache(),
      ),
    );

    // 你可以在这里使用client进行其他GraphQL操作,比如查询或变更
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('GraphQL ActionCable Integration'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Subscription Data:'),
            ValueListenableBuilder<Map<String, dynamic>>(
              valueListenable: subscriptionData,
              builder: (_, data, __) {
                if (data['someDataUpdate'] != null) {
                  return Text(
                    'ID: ${data['someDataUpdate'][0]['id']}, Value: ${data['someDataUpdate'][0]['value']}',
                    style: TextStyle(fontSize: 20),
                  );
                } else {
                  return Text('No data yet.');
                }
              },
            ),
          ],
        ),
      ),
    );
  }

  @override
  void dispose() {
    subscriptionData.dispose();
    super.dispose();
  }
}

在这个示例中:

  1. ActionCable URL:替换wss://your-action-cable-server-url为你的ActionCable服务器URL。
  2. GraphQL订阅查询subscriptionQuery变量包含你的GraphQL订阅查询。你需要根据你的GraphQL API调整这个查询。
  3. ActionCable LinkActionCableLink被创建并配置为连接到ActionCable服务器并订阅特定的GraphQL查询。
  4. GraphQL客户端:使用GraphQLClient来管理GraphQL操作,这里主要关注订阅。
  5. UI更新:使用ValueNotifierValueListenableBuilder来在UI中实时显示订阅数据。

请确保你的ActionCable服务器正确配置,并且你的GraphQL API支持订阅。这个示例提供了一个基础框架,你可以根据需要进行扩展和修改。

回到顶部