Flutter GraphQL与ActionCable集成插件graphql_action_cable_link的使用
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,
);
设置默认头信息
类似于HttpLink
,ActionCableLink
也支持设置默认头信息:
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
更多关于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_flutter
和graphql_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();
}
}
在这个示例中:
- ActionCable URL:替换
wss://your-action-cable-server-url
为你的ActionCable服务器URL。 - GraphQL订阅查询:
subscriptionQuery
变量包含你的GraphQL订阅查询。你需要根据你的GraphQL API调整这个查询。 - ActionCable Link:
ActionCableLink
被创建并配置为连接到ActionCable服务器并订阅特定的GraphQL查询。 - GraphQL客户端:使用
GraphQLClient
来管理GraphQL操作,这里主要关注订阅。 - UI更新:使用
ValueNotifier
和ValueListenableBuilder
来在UI中实时显示订阅数据。
请确保你的ActionCable服务器正确配置,并且你的GraphQL API支持订阅。这个示例提供了一个基础框架,你可以根据需要进行扩展和修改。