Flutter RT Database connection error

Facing a “Connection failed” error when creating a Real Time database event handler for a custom data table. I tried attaching an event handler for a system table (Users) and I get the same error.

The below code snippets are from a minimal Flutter app, to reproduce the issue. Not shown, is the button for logging in with hard coded values before attempting to add the event handlers, to ensure we’re authenticated.

App ID: 10D48062-3F1B-573A-FF51-E119D6C58000

Flutter dependencies:
backendless_sdk: ^6.3.0

android/app/build.gradle:

    dependencies {
       implementation ('io.socket:socket.io-client:2.0.0') { 
         // excluding org.json which is provided by Android 
         exclude group: 'org.json', module: 'json' 
       }
    }

Backendless setup:

@override
void initState() {
	super.initState();
	Backendless.initApp(
	'10D48062-3F1B-573A-FF51-E119D6C58000',
	'MY_ANDROID_API_KEY',
	'MY_IOS_API_KEY',
	);
}

Adding connect listener:

void foo() {
Backendless.rt.addConnectListener(() => print('Connected'));
}

Attaching Event Handler:

void bar() {
EventHandler<UserSettings> eventHandler =
      Backendless.data.withClass<UserSettings>().rt();
      
eventHandler.addUpdateListener(
	(response) {
	  print('Updated data recieved: ${response.}');
	},
	whereClause: "objectId = '$userObjectId'",
	);
}

Error:

I/RTClient(28891): try to subscribe RTSubscription{id='0D55F562-3250-9DD1-FF4A-046296393F00', callback=com.backendless.rt.data.EventHandlerImpl$5@b526508, subscriptionName=OBJECTS_CHANGES, options={event=updated, tableName=UserSettings}}
I/cketIOConnectionManager(28891): Socket not connected. Try to get lock
I/cketIOConnectionManager(28891): Got lock
2
I/System.out(28891): (HTTPLog)-Static: isSBSettingEnabled false
I/cketIOConnectionManager(28891): Looked up for server https://rt-cloud-us.backendless.com:3001/10D48062-3F1B-573A-FF51-E119D6C58000
I/cketIOConnectionManager(28891): try to connect with to host with query: apiKey=<MY_ANDROID_API_KEY>&clientId=7a1e2a3e1805a56a&binary=true&userToken=D9C1DAE1-12BB-409F-BAF2-B69EBFA38B5A
I/cketIOConnectionManager(28891): Socket object created
W/socket_app_tes(28891): Accessing hidden method Ldalvik/system/CloseGuard;->get()Ldalvik/system/CloseGuard; (greylist,core-platform-api, reflection, allowed)
W/socket_app_tes(28891): Accessing hidden method Ldalvik/system/CloseGuard;->open(Ljava/lang/String;)V (greylist,core-platform-api, reflection, allowed)
W/socket_app_tes(28891): Accessing hidden method Ldalvik/system/CloseGuard;->warnIfOpen()V (greylist,core-platform-api, reflection, allowed)
E/cketIOConnectionManager(28891): Connection failed [io.socket.engineio.client.EngineIOException: server error]
I/cketIOConnectionManager(28891): Try to disconnect
I/cketIOConnectionManager(28891): Wait for 200 before reconnect
I/cketIOConnectionManager(28891): Socket not connected. Try to get lock
I/cketIOConnectionManager(28891): Got lock
2
I/System.out(28891): (HTTPLog)-Static: isSBSettingEnabled false
I/cketIOConnectionManager(28891): Looked up for server https://rt-cloud-us.backendless.com:3001/10D48062-3F1B-573A-FF51-E119D6C58000
I/cketIOConnectionManager(28891): try to connect with to host with query: apiKey=<MY_ANDROID_API_KEY>&clientId=7a1e2a3e1805a56a&binary=true&userToken=D9C1DAE1-12BB-409F-BAF2-B69EBFA38B5A
I/cketIOConnectionManager(28891): Socket object created
E/cketIOConnectionManager(28891): Connection failed [io.socket.engineio.client.EngineIOException: server error]
I/cketIOConnectionManager(28891): Try to disconnect
I/cketIOConnectionManager(28891): Wait for 200 before reconnect
I/cketIOConnectionManager(28891): Socket not connected. Try to get lock
I/cketIOConnectionManager(28891): Got lock
...

The error occurs after running bar().

Am I missing something on the client side? I followed the Client Side Setup section (which doesn’t mention adding socket.io dependency to build.gradle), but I don’t see any steps that I’ve missed. Any advice is appreciated!

Hello @John_Admin

I have created an internal ticket BKNDLSS-24678 to investigate your problem. We will let you know the result as soon as possible.

Regards,
Inna

1 Like

Hey @Inna_Shkolnaya, any update on this issue?

Thanks again!

Hello @John_Admin,

any update on this issue?

Not yet.
We will notify you here of any progress.

Regards,
Stanislaw

Hi @John_Admin

You should implement socket library v.1.0.0, not 2.0.0:

 implementation ('io.socket:socket.io-client:1.0.0') {  
      // excluding org.json which is provided by Android  
      exclude group: 'org.json', module: 'json'  
    } 

There is a documentation for Android part:
https://backendless.com/docs/android/setup.html

And we will definitely update the Flutter docs.

Best Regards,
Maksym

@Maksym_Khobotin when I downgrade socket library to 1.0.0 I get the following error which causes the app to crash.

I/cketIOConnectionManager(24648): Connected event
I/cketIOConnectionManager(24648): Socket is connected
I/RTClient(24648): subOn called
E/EventThread(24648): Task threw exception
E/EventThread(24648): java.lang.RuntimeException: Methods marked with @UiThread must be executed on the main thread. Current thread: EventThread
E/EventThread(24648): 	at io.flutter.embedding.engine.FlutterJNI.ensureRunningOnMainThread(FlutterJNI.java:1230)
E/EventThread(24648): 	at io.flutter.embedding.engine.FlutterJNI.dispatchPlatformMessage(FlutterJNI.java:862)
E/EventThread(24648): 	at io.flutter.embedding.engine.dart.DartMessenger.send(DartMessenger.java:72)
E/EventThread(24648): 	at io.flutter.embedding.engine.dart.DartExecutor$DefaultBinaryMessenger.send(DartExecutor.java:397)
E/EventThread(24648): 	at io.flutter.embedding.engine.dart.DartExecutor.send(DartExecutor.java:182)
E/EventThread(24648): 	at io.flutter.plugin.common.MethodChannel.invokeMethod(MethodChannel.java:97)
E/EventThread(24648): 	at io.flutter.plugin.common.MethodChannel.invokeMethod(MethodChannel.java:83)
E/EventThread(24648): 	at com.backendless.backendless_sdk.call_handlers.RtCallHandler$EventResult.handle(RtCallHandler.java:163)
E/EventThread(24648): 	at com.backendless.rt.RTServiceImpl.handle(RTServiceImpl.java:137)
E/EventThread(24648): 	at com.backendless.rt.RTServiceImpl.access$100(RTServiceImpl.java:9)
E/EventThread(24648): 	at com.backendless.rt.RTServiceImpl$1.handle(RTServiceImpl.java:27)
E/EventThread(24648): 	at com.backendless.rt.RTServiceImpl$1.handle(RTServiceImpl.java:23)
E/EventThread(24648): 	at com.backendless.rt.RTClientSocketIO$1.connected(RTClientSocketIO.java:47)
E/EventThread(24648): 	at com.backendless.rt.SocketIOConnectionManager$7.call(SocketIOConnectionManager.java:96)
E/EventThread(24648): 	at io.socket.emitter.Emitter.emit(Emitter.java:117)
E/EventThread(24648): 	at io.socket.client.Socket.access$601(Socket.java:24)
E/EventThread(24648): 	at io.socket.client.Socket$5.run(Socket.java:186)
E/EventThread(24648): 	at io.socket.thread.EventThread.exec(EventThread.java:55)
E/EventThread(24648): 	at io.socket.client.Socket.emit(Socket.java:182)
E/EventThread(24648): 	at io.socket.client.Socket.onconnect(Socket.java:389)
E/EventThread(24648): 	at io.socket.client.Socket.onpacket(Socket.java:283)
E/EventThread(24648): 	at io.socket.client.Socket.access$100(Socket.java:24)
E/EventThread(24648): 	at io.socket.client.Socket$2$2.call(Socket.java:120)
E/EventThread(24648): 	at io.socket.emitter.Emitter.emit(Emitter.java:117)
E/EventThread(24648): 	at io.socket.client.Manager.ondecoded(Manager.java:427)
E/EventThread(24648): 	at io.socket.client.Manager.access$1600(Manager.java:30)
E/EventThread(24648): 	at io.socket.client.Manager$7.call(Manager.java:403)
E/EventThread(24648): 	at io.socket.parser.IOParser$Decoder.add(IOParser.java:105)
E/EventThread(24648): 	at io.socket.client.Manager.ondata(Manager.java:419)
E/EventThread(24648): 	at io.socket.client.Manager.access$1000(Manager.java:30)
E/EventThread(24648): 	at io.socket.client.Manager$2.call(Manager.java:370)
E/EventThread(24648): 	at io.socket.emitter.Emitter.emit(Emitter.java:117)
E/EventThread(24648): 	at io.socket.engineio.client.Socket.onPacket(Socket.java:551)
E/EventThread(24648): 	at io.socket.engineio.client.Socket.access$1000(Socket.java:36)
E/EventThread(24648): 	at io.socket.engineio.client.Socket$5.call(Socket.java:335)
E/EventThread(24648): 	at io.socket.emitter.Emitter.emit(Emitter.java:117)
E/EventThread(24648): 	at io.socket.engineio.client.Transport.onPacket(Transport.java:126)
E/EventThread(24648): 	at io.socket.engineio.client.transports.Polling.access$700(Polling.java:18)
E/EventThread(24648): 	at io.socket.engineio.client.transports.Polling$2.call(Polling.java:127)
E/EventThread(24648): 	at io.socket.engineio.parser.Parser.decodePayload(Parser.java:241)
E/EventThread(24648): 	at io.socket.engineio.client.transports.Polling._onData(Polling.java:135)
E/EventThread(24648): 	at io.socket.engineio.client.transports.Polling.onData(Polling.java:102)
E/EventThread(24648): 	at io.socket.engineio.client.transports.PollingXHR$5$1.run(PollingXHR.java:125)
E/EventThread(24648): 	at io.socket.thread.EventThread$2.run(EventThread.java:80)
E/EventThread(24648): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
E/EventThread(24648): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
E/EventThread(24648): 	at java.lang.Thread.run(Thread.java:919)
E/AndroidRuntime(24648): FATAL EXCEPTION: EventThread
E/AndroidRuntime(24648): Process: com.example.socket_app_test, PID: 24648

Hi @John_Admin

We couldn’t reproduce your issue. Can you please provide the minimal reproducible example for your issue?

You can also download the project template that contains code sample for RT connection: open backendless console, click on your profile at upper right corner, choose “Download project template” and select Flutter. Could you check if that sample works for you?

Best Regards,
Maksym