Flutter GraphQL配置中如何正确关闭WebSocket 解决1001错误码异常
问题原因
你遇到的DOMException是Web端WebSocket协议的硬性限制导致的:WebSocket规范明确要求,手动调用关闭接口时使用的状态码只能是1000(代表正常关闭),或者3000~4999区间的自定义业务码,1001属于协议保留的状态码(代表端点断开连接,比如页面跳转),不允许开发者手动调用时传入,所以抛出了异常。
解决方案
你需要先将配置中的WebSocketLink实例抽离为可单独访问的成员,再自定义关闭方法指定合法的关闭码即可,修改后的配置类如下:
import 'package:graphql/client.dart'; import 'package:graphql_flutter/graphql_flutter.dart'; class GraphqlConfig { // 单独抽离WebSocketLink实例,方便后续操作 final _webSocketLink = WebSocketLink("mylink"); final serverLink = Link.split( (request) => request.isSubscription, // 引用抽离的实例 _webSocketLink, HttpLink("mylink", defaultHeaders: <String, String>{ })); ValueNotifier<GraphQLClient> initClient() { ValueNotifier<GraphQLClient> client = ValueNotifier( GraphQLClient( link: serverLink, cache: GraphQLCache(), ), ); return client; } GraphQLClient clientToQuery() { return GraphQLClient( cache: GraphQLCache(), link: serverLink, ); } // 新增关闭WebSocket的方法,指定合法关闭码 Future<void> closeWebSocket() async { // 传入1000代表正常关闭,符合Web端协议要求 await _webSocketLink.dispose(code: 1000, reason: "正常关闭连接"); } }
使用方式
需要关闭WebSocket连接时,直接调用closeWebSocket()方法即可:
// 示例:页面销毁时关闭连接 @override void dispose() { graphqlConfig.closeWebSocket(); super.dispose(); }
内容的提问来源于stack exchange,提问作者EA vijay
相关产品推荐
相关产品推荐

