kakajansh / echo

Laravel Echo for your Flutter apps.
MIT License
107 stars 68 forks source link

handle receiving empty/null props in SocketIoChannel listener #63

Open AmrNRD opened 1 year ago

AmrNRD commented 1 year ago

I received this error while auto reconnect after disconnecting on Socket IO

 Unhandled Exception: NoSuchMethodError: The method '[]' was called on null.
Receiver: null
Tried calling: [](0)
#0      Object.noSuchMethod (dart:core-patch/object_patch.dart:38:5)
#1      SocketIoChannel.on.<anonymous closure> (package:laravel_echo/src/channel/socketio-channel.dart:90:31)
#2      EventEmitter.emit.<anonymous closure> (package:socket_io_common/src/util/event_emitter.dart:51:14)
#3      List.forEach (dart:core-patch/growable_array.dart:416:8)
#4      EventEmitter.emit (package:socket_io_common/src/util/event_emitter.dart:50:11)
#5      Socket.emitWithAck (package:socket_io_client/src/socket.dart:138:13)
#6      Socket.emit (package:socket_io_client/src/socket.dart:123:5)
#7      Socket.onconnect (package:socket_io_client/src/socket.dart:326:5)
#8      Socket.onpacket (package:socket_io_client/src/socket.dart:222:9)
#9      EventEmitter.emit.<anonymous closure> (package:socket_io_common/src/util/event_emitter.dart:51:14)
#10     List.forEach (dart:core-patch/growable_array.dart:416:8)
#11     EventEmitter.emit (package:socket_io_common/src/util/event_emitter.dart:50:11)
#12     Manager.ondecoded (package:socket_io_client/src/manager.dart:283:5)
#13     EventEmitter.emit.<anonymous closure> (package:socket_io_common/src/util/event_emitter.dart:51:14)
#14     List.forEach (dart:core-patch/growable_array.dart:416:8)
#15     EventEmitter.emit (package:socket_io_common/src/util/event_emitter.dart:50:11)
#16     Decoder.add (package:socket_io_common/src/parser/parser.dart:159:14)
#17     Manager.ondata (package:socket_io_client/src/manager.dart:274:13)
#18     EventEmitter.emit.<anonymous closure> (package:socket_io_common/src/util/event_emitter.dart:51:14)
#19     List.forEach (dart:core-patch/growable_array.dart:416:8)
#20     EventEmitter.emit (package:socket_io_common/src/util/event_emitter.dart:50:11)
#21     Socket.onPacket (package:socket_io_client/src/engine/socket.dart:462:11)
#22     Socket.setTransport.<anonymous closure> (package:socket_io_client/src/engine/socket.dart:287:34)
#23     EventEmitter.emit.<anonymous closure> (package:socket_io_common/src/util/event_emitter.dart:51:14)
#24     List.forEach (dart:core-patch/growable_array.dart:416:8)
#25     EventEmitter.emit (package:socket_io_common/src/util/event_emitter.dart:50:11)
#26     Transport.onPacket (package:socket_io_client/src/engine/transport/transport.dart:128:5)
#27     Transport.onData (package:socket_io_client/src/engine/transport/transport.dart:122:5)
#28     IOWebSocketTransport.addEventListeners.<anonymous closure> (package:socket_io_client/src/engine/transport/io_websocket_transport.dart:67:7)
#29     _RootZone.runUnaryGuarded (dart:async/zone.dart:1586:10)
#30     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:339:11)
#31     _BufferingStreamSubscription._add (dart:async/stream_impl.dart:271:7)
#32     _SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:774:19)
#33     _StreamController._add (dart:async/stream_controller.dart:648:7)
#34     _StreamController.add (dart:async/stream_controller.dart:596:5)
#35     new _WebSocketImpl._fromSocket.<anonymous closure> (dart:_http/websocket_impl.dart:1144:21)
#36     _RootZone.runUnaryGuarded (dart:async/zone.dart:1586:10)
#37     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:339:11)
#38     _BufferingStreamSubscription._add (dart:async/stream_impl.dart:271:7)
#39     _SinkTransformerStreamSubscription._add (dart:async/stream_transformers.dart:63:11)
#40     _EventSinkWrapper.add (dart:async/stream_transformers.dart:13:11)
#41     _WebSocketProtocolTransformer._messageFrameEnd (dart:_http/websocket_impl.dart:332:23)
#42     _WebSocketProtocolTransformer.add (dart:_http/websocket_impl.dart:226:46)
#43     _SinkTransformerStreamSubscription._handleData (dart:async/stream_transformers.dart:111:24)
#44     _HttpDetachedStreamSubscription._maybeScheduleData.<anonymous closure> (dart:_http/http_parser.dart:173:20)
#45     _microtaskLoop (dart:async/schedule_microtask.dart:40:21)
#46     _startMicrotaskLoop (dart:async/schedule_microtask.dart:49:5)

I fixed it by simply checking props before calling the listener.

Before: (props) { String channel = props[0]; dynamic data = props[1]; if (this.name == channel && this._listeners[event]!.isNotEmpty) { this._listeners[event]!.forEach((cb) => cb(data)); } }

After: (props) { if(props is List&&props.length>1){ String channel = props[0]; dynamic data = props[1]; if (this.name == channel && this._listeners[event]!.isNotEmpty) { this._listeners[event]!.forEach((cb) => cb(data)); } } }