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

Flutter接收路由器Socket响应后如何取消事件监听器

Flutter Socket接收首次响应后立即关闭监听器实现方案

socket.listen() 调用后会返回StreamSubscription类型的订阅实例,你只需要持有这个实例,在首次接收到有效响应、完成业务逻辑后调用该实例的cancel()方法,就能立即终止当前监听器,不会再接收后续推送的消息,也不会影响你后续把Socket实例传递给其他页面复用。

修改后的实现代码如下:

// 提前声明订阅对象变量用于持有监听实例
StreamSubscription<List<int>>? socketSubscription;

Socket socket = await Socket.connect(
  ip,
  port,
  timeout: const Duration(seconds: 3),
);

socket.add(
  ascii.encode('status'),
);

// 将listen返回的订阅实例赋值给提前声明的变量
socketSubscription = socket.listen(
  (List<int> event) async {
    // 处理响应解析、状态更新逻辑
    final response = utf8.decode(event);
    Provider.of<relayStatus>(context, listen: false).setRelayStatus = response;
    
    // 收到响应立刻取消当前监听器,停止接收后续消息
    await socketSubscription?.cancel();
    socketSubscription = null;

    // 监听器关闭后再执行页面跳转逻辑,增加挂载判断避免上下文异常
    if (context.mounted) {
      Navigator.push(
        context,
        MaterialPageRoute(
          builder: (context) => OnOffPage(socket),
        ),
      );
    }
  },
);

注意:这里仅取消了当前的消息监听器,没有调用socket.close()或者socket.destroy()销毁Socket连接,后续在OnOffPage中仍然可以正常使用这个Socket实例收发消息。

内容的提问来源于stack exchange,提问作者Soroush Nikpour

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 11:15:42