You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 19:06:01