socket.io-client-dart
socket.io-client-dart copied to clipboard
Multiple receive event calls
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<ChatMessageModel> 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
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
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 });
@zhangyc Did you found the resolution to the problem.
Have same issue... any work around for it??
Have same issue... any work around for it??
I remember it was caused by multiple monitoring, you see if you have performed multiple monitoring