防止创建套接字侦听类的多个实例

问题描述 投票:0回答:1

我目前正在我的 flutter 应用程序中使用 socket.io 来处理消息传递。我正在使用 Bloc 来管理聊天状态(包括套接字)。然后,我使用单独的

ChatSocketListener
类来处理传入事件。这是我的设置:

...
class _ChatScreenState extends State<ChatScreen> {
  ChatSocketListener _chatSocketListener;

  @override
  void initState() {
    _chatSocketListener = ChatSocketListener(context);
    Future.delayed(Duration.zero, () {
      _chatSocketListener = ChatSocketListener(context);
    });
    super.initState();
  }

 @override
  Widget build(BuildContext context) {
    return BlocConsumer<ChatBloc, ChatState>(
      listenWhen: (previous, current) {
        if (current.socket != null) {
          return true;
        } else {
          return false;
        }
      },
      listener: (context, state) {
        setState(() {
          _chatSocketListener = ChatSocketListener(context);
        });  
      },
      builder: (context, state) {
        return Scaffold(
            appBar: ChatAppBar(),
            body: Container(
              child: ChatBody(),
          ),
        );
      },
    );
  }

我有一个 _chatSocketListener 状态变量,每次我的

ChatBloc
状态发生变化时,都会创建和更新该变量,正如您在 Bloc 侦听器中看到的那样。这使套接字保持更新为我需要的最新
ChatBloc
状态。

现在,这是我的

ChatSocketListener
课程。

class ChatSocketListener {
  BuildContext context;

  ChatSocketListener(this.context) {
    print('SOCKET LISTENER HAS BEEN INITIALIZED');
    if (context != null) {
      ChatBloc chatBloc = BlocProvider.of<ChatBloc>(context);
      final chatState = chatBloc.state;
      if (chatState?.socket != null) {
        chatState.socket.on('testEvent', (data) async {
          if (chatState.messagesLoading) {
            chatBloc.add(ChatEvent.testEvent());
          }
        });
      }
    }
  }
}


一切正常,但有一个大问题。每次更新 ChatBloc 时,

_chatSocketListener
都会更新为最新的上下文。然而,之前的
ChatSocketListener
实例似乎没有被处理。这会导致终端打印

SOCKET LISTENER HAS BEEN INITIALIZED
SOCKET LISTENER HAS BEEN INITIALIZED
SOCKET LISTENER HAS BEEN INITIALIZED
SOCKET LISTENER HAS BEEN INITIALIZED
SOCKET LISTENER HAS BEEN INITIALIZED

然后,我的所有套接字事件都会被多次调用。

我尝试在我的

ChatSocketListener
类中创建更新上下文方法,如下所示:

  void update(newContext) {
    context = newContext;
  }

setState(() {
  _chatSocketListener.update(context);
});

但这实际上并没有更新

ChatSocketListener

非常感谢任何帮助。谢谢

flutter dart socket.io bloc
1个回答
-1
投票

我也有同样的问题。 您找到解决方案了吗?

© www.soinside.com 2019 - 2024. All rights reserved.