rikulo / socket.io-client-dart

socket.io-client-dart: Dartlang port of socket.io-client https://github.com/socketio/socket.io-client
https://quire.io
MIT License
671 stars 182 forks source link

Multiple receive event calls #230

Open ShikharVayuz opened 2 years ago

ShikharVayuz commented 2 years ago

The 'on' event is getting triggered multiple times i.e. : 5. For a single message when sent from the admin server. (Receiver - app). Dart : socket_io_client: ^2.0.0-beta.4-nullsafety.0 Node J's : version 4.0.

Dart (Code) @override void initState() { super.initState(); ChatMessageNotifier().demoChat.clear(); ProfileProvider().getPersonalProfile(User().userId).then((value) { userProfile = ProfileProvider().userProfile; tutorId = userProfile.tutorId; }); streamHit = false; connectToServer(); }

void connectToServer() { try { // Configure socket transports must be sepecified socket = IO.io(socketUrl, <String, dynamic>{ 'transports': ['websocket'], // 'autoConnect': true, });

  // Connect to websocket
  socket.connect();
  socket.onConnect((data) {
    socket.emit('message-history',
        {'request_id': widget.requestId, 'tutor_id': tutorId});
    log('Connected $data');
  });

  // Handle socket events
  // socket.on('connect', (_) => print('connect: ${socket.id}'));
  socket.on('recieve', (events) {
    recieveMessage(events);
  });
  socket.onError((data) {
    log('onError', error: data);
  });

} catch (e) {
  print(e.toString());
}

}

Future tutorSendMessage(String message, {String type}) async { var body = json.encode({ 'data': { 'request_id': widget.requestId, 'tutor_id': tutorId, 'message': message, 'fileType': type, 'type': 'Tutor' } }); // ignore: omit_local_variable_types final http.Response response = await http.post( Uri.parse( 'https://eduarno1.herokuapp.com/admin/request/post_tutor_chat'), headers: {'Content-Type': 'application/json'}, body: body);

if (response.statusCode == 200) {
  final chatMessageModel = chatMessageModelFromJson(response.body);
  return chatMessageModel;
} else {
  return ChatMessageModel();
}

}

// Send a Message to the server void sendMessage(String message, {String type}) { // log(message); log(widget.requestId); log(tutorId); tutorSendMessage(message, type: type).then((value) { ChatMessageNotifier() .chatAdder(value, _controller, widget.requestId, tutorId); var encodedData = json.encode(value); log('${value.data.first}');

  socket.emit('send-message', encodedData);
  _sendMessageController.clear();
});

}

void recieveMessage(events) { streamHit = true;

log('${events}', name: 'Recieve event');
var eventJson = json.encode(events);
// log('$eventJson');
String eventString = eventJson.toString();
final chatMessageModel = chatMessageModelFromJson(eventString);
if (chatMessageModel.data != null && chatMessageModel.data.isNotEmpty) {
  // chatMessageModel.data.forEach((chatMessage) {
  //   ChatMessageNotifier().demoChat.add(ChatMessage(
  //       chatMessage.message,
  //       getType(chatMessage.message),
  //       chatMessage.type.toLowerCase() == 'tutor' ? true : false,
  //       chatMessage.isCreated));
  // });
  ChatMessageNotifier()
      .chatAdder(chatMessageModel, _controller, widget.requestId, tutorId);
  // ChatMessageNotifier().demoChat = List.generate(
  //     chatMessageModel.data.length,
  //     (index) => ChatMessage(
  //         chatMessageModel.data[index].message,
  //         getType(chatMessageModel.data[index].message),
  //         chatMessageModel.data[index].type.toLowerCase() == 'tutor'
  //             ? true
  //             : false,
  //         chatMessageModel.data[index].isCreated));
  SchedulerBinding.instance.addPostFrameCallback((_) {
    if (_controller.hasClients) {
      _controller.animateTo(
        _controller.position.maxScrollExtent,
        duration: const Duration(milliseconds: 10),
        curve: Curves.easeOut,
      );
    }
  });
  // Timer(Duration(milliseconds: 300),
  //     () => _controller.jumpTo(_controller.position.maxScrollExtent));
} else {
  ChatMessageNotifier().demoChat = [];
}
log('${ChatMessageNotifier().demoChat}', name: 'Chats');

}

@rikulo @jumperchen @henrichen @tomyeh @jimmyshiau @fzyzcjy @Kavantix @felangel @bruce3x @Oskang09 @sarru1291 @kerolloz @hrishiksh

rohitrvayuz commented 2 years ago

Please share the code too and mention the platform and package version

@rikulo @jumperchen @henrichen @tomyeh @jimmyshiau @fzyzcjy @Kavantix @felangel @bruce3x @Oskang09 @sarru1291 @kerolloz @hrishiksh

zhangyc commented 2 years ago

socket_io_client: ^1.0.1 The same on will be executed three times

D:\AndroidProjects\pinpon-flutter>flutter doctor Doctor summary (to see all details, run flutter doctor -v): [√] Flutter (Channel stable, 2.5.3, on Microsoft Windows [Version 10.0.22000.318], locale zh-CN) [!] Android toolchain - develop for Android devices (Android SDK version 31.0.0-rc4) X cmdline-tools component is missing Run path/to/sdkmanager --install "cmdline-tools;latest" See https://developer.android.com/studio/command-line for more details. X Android license status unknown. Run flutter doctor --android-licenses to accept the SDK licenses. See https://flutter.dev/docs/get-started/install/windows#android-setup for more details. [√] Chrome - develop for the web [√] Android Studio (version 2020.3) [√] IntelliJ IDEA Ultimate Edition (version 2020.2) [√] Connected device (4 available)

! Doctor found issues in 1 category.

Platform is android

code SocketManager.socket.on(ServerRemotePlayerControl.EVENT_JOIN_NAME, (value) { print(jsonEncode(value)); ///Executed three times });

Shikhar0018 commented 2 years ago

@zhangyc Did you found the resolution to the problem.

rmControls commented 2 years ago

Have same issue... any work around for it??

zhangyc commented 2 years ago

Have same issue... any work around for it??

I remember it was caused by multiple monitoring, you see if you have performed multiple monitoring