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
相关产品推荐
相关产品推荐

