EventBus with Flutter is seeking BackEvent class during runtime - Stack Overflow

admin2025-05-02  1

I have been using EventBus since 2017 and I have been able to delivery excellent products to my customers using it. Thanks a lot for such a wonderful tool without which this was not possible.

Lately I have been trying to implement the following on Flutter

  1. We have compiled an .aar file which we want to distribute. The aar is expected to execute in the background where it keeps firing various events as it encounters using GPS, gyrometer, Wifi, Bluetooth and what not stuff. its a monitoring tool.
  2. This aar file when integrated with android works like a charm.
  3. So we started to extend it for Flutter. Here we implemented the Native Bridge to send the name of the events that occurs in our aar during runtime. So we implemented code to register the EventBus with the MainActivity (here the activity extends FlutterActivity), there is a member method which subscribes for the events, That's it for now. We intent to send this communication to Flutter via Native Bridge (though in isolation, we observed that things are propagating via Native Bridge so that implementation looks clean).
  4. During run time, we experience the error that register method of the EventBus fails to get /android/window.backevent class.

Here is the helpful stuff

On MainActivity.kt (extends FlutterActvity)

override fun onStart() {      
if (!MySDK.getEventBus().isRegistered(this)) {   
     MySDK.getEventBus().register(this)     
     Log.i(TAG, "EVENT_BUS => MainActivity successfully register to event bus") 
   } 
   super.onStart()
}

@Subscribe(threadMode = ThreadMode.ASYNC)
    public fun lookForChangeInEvents(event: Any){
        Log.i(TAG!!, String.format("This is the following event %s", event.toString()))
    }

The Error we experience is

Process: com.example.ruc_flutter, PID: 11824
java.lang.NoClassDefFoundError: Failed resolution of: Landroid/window/BackEvent;
            at java.lang.reflect.Executable.getParameterTypesInternal(Native Method)
            at java.lang.reflect.Method.getParameterTypes(Method.java:186)
            at org.greenrobot.eventbus.SubscriberMethodFinder.findUsingReflectionInSingleClass(SubscriberMethodFinder.java:173)
            at org.greenrobot.eventbus.SubscriberMethodFinder.findUsingInfo(SubscriberMethodFinder.java:88)
            at org.greenrobot.eventbus.SubscriberMethodFinder.findSubscriberMethods(SubscriberMethodFinder.java:64)
            at org.greenrobot.eventbus.EventBus.register(EventBus.java:150)
            at com.example.ruc_flutter.MainActivity.onStart(MainActivity.kt:45)
            at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1455)
            at android.app.Activity.performStart(Activity.java:8315)
            at android.app.ActivityThread.handleStartActivity(ActivityThread.java:4136)
            at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
            at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
            at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
            at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2443)
            at android.os.Handler.dispatchMessage(Handler.java:106)
            at android.os.Looper.loopOnce(Looper.java:226)
            at android.os.Looper.loop(Looper.java:313)
            at android.app.ActivityThread.main(ActivityThread.java:8751)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135)

          Caused by: java.lang.ClassNotFoundException: Didn't find class "android.window.BackEvent" on path: DexPathList[[zip file "/data/app/~~f23eg9s3HO-H1f5vyz9yqw==/com.example.ruc_flutter-VO7Qr3chQxbW1v_Vz-0G_Q==/base.apk"],nativeLibraryDirectories=[/data/app/~~f23eg9s3HO-H1f5vyz9yqw==/com.example.ruc_flutter-VO7Qr3chQxbW1v_Vz-0G_Q==/lib/arm64, /data/app/~~f23eg9s3HO-H1f5vyz9yqw==/com.example.ruc_flutter-VO7Qr3chQxbW1v_Vz-0G_Q==/base.apk!/lib/arm64-v8a, /system/lib64, /system/system_ext/lib64]]
            at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:259)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:637)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
            at java.lang.reflect.Executable.getParameterTypesInternal(Native Method) 
            at java.lang.reflect.Method.getParameterTypes(Method.java:186) 
            at org.greenrobot.eventbus.SubscriberMethodFinder.findUsingReflectionInSingleClass(SubscriberMethodFinder.java:173) 
            at org.greenrobot.eventbus.SubscriberMethodFinder.findUsingInfo(SubscriberMethodFinder.java:88) 
            at org.greenrobot.eventbus.SubscriberMethodFinder.findSubscriberMethods(SubscriberMethodFinder.java:64) 
            at org.greenrobot.eventbus.EventBus.register(EventBus.java:150) 
            at com.example.ruc_flutter.MainActivity.onStart(MainActivity.kt:45) 
            at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1455) 
            at android.app.Activity.performStart(Activity.java:8315) 
            at android.app.ActivityThread.handleStartActivity(ActivityThread.java:4136) 
            at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221) 
            at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201) 
            at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173) 
            at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2443) 
            at android.os.Handler.dispatchMessage(Handler.java:106) 
            at android.os.Looper.loopOnce(Looper.java:226) 
            at android.os.Looper.loop(Looper.java:313) 
            at android.app.ActivityThread.main(ActivityThread.java:8751) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135) 

 

We did check the following before coming to SO

  • proguard is disabled, we enabled it once to pass -donotwarn directive for BackEvent class
  • Override onBackPressed (deprecated) and did the alternate implementation provided as per Android (no luck)
  • We pass, this as argument, this.context ... no luck

Can someone help us understand what are we missing out or overlooking ?

I have been using EventBus since 2017 and I have been able to delivery excellent products to my customers using it. Thanks a lot for such a wonderful tool without which this was not possible.

Lately I have been trying to implement the following on Flutter

  1. We have compiled an .aar file which we want to distribute. The aar is expected to execute in the background where it keeps firing various events as it encounters using GPS, gyrometer, Wifi, Bluetooth and what not stuff. its a monitoring tool.
  2. This aar file when integrated with android works like a charm.
  3. So we started to extend it for Flutter. Here we implemented the Native Bridge to send the name of the events that occurs in our aar during runtime. So we implemented code to register the EventBus with the MainActivity (here the activity extends FlutterActivity), there is a member method which subscribes for the events, That's it for now. We intent to send this communication to Flutter via Native Bridge (though in isolation, we observed that things are propagating via Native Bridge so that implementation looks clean).
  4. During run time, we experience the error that register method of the EventBus fails to get /android/window.backevent class.

Here is the helpful stuff

On MainActivity.kt (extends FlutterActvity)

override fun onStart() {      
if (!MySDK.getEventBus().isRegistered(this)) {   
     MySDK.getEventBus().register(this)     
     Log.i(TAG, "EVENT_BUS => MainActivity successfully register to event bus") 
   } 
   super.onStart()
}

@Subscribe(threadMode = ThreadMode.ASYNC)
    public fun lookForChangeInEvents(event: Any){
        Log.i(TAG!!, String.format("This is the following event %s", event.toString()))
    }

The Error we experience is

Process: com.example.ruc_flutter, PID: 11824
java.lang.NoClassDefFoundError: Failed resolution of: Landroid/window/BackEvent;
            at java.lang.reflect.Executable.getParameterTypesInternal(Native Method)
            at java.lang.reflect.Method.getParameterTypes(Method.java:186)
            at org.greenrobot.eventbus.SubscriberMethodFinder.findUsingReflectionInSingleClass(SubscriberMethodFinder.java:173)
            at org.greenrobot.eventbus.SubscriberMethodFinder.findUsingInfo(SubscriberMethodFinder.java:88)
            at org.greenrobot.eventbus.SubscriberMethodFinder.findSubscriberMethods(SubscriberMethodFinder.java:64)
            at org.greenrobot.eventbus.EventBus.register(EventBus.java:150)
            at com.example.ruc_flutter.MainActivity.onStart(MainActivity.kt:45)
            at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1455)
            at android.app.Activity.performStart(Activity.java:8315)
            at android.app.ActivityThread.handleStartActivity(ActivityThread.java:4136)
            at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
            at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
            at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
            at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2443)
            at android.os.Handler.dispatchMessage(Handler.java:106)
            at android.os.Looper.loopOnce(Looper.java:226)
            at android.os.Looper.loop(Looper.java:313)
            at android.app.ActivityThread.main(ActivityThread.java:8751)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135)

          Caused by: java.lang.ClassNotFoundException: Didn't find class "android.window.BackEvent" on path: DexPathList[[zip file "/data/app/~~f23eg9s3HO-H1f5vyz9yqw==/com.example.ruc_flutter-VO7Qr3chQxbW1v_Vz-0G_Q==/base.apk"],nativeLibraryDirectories=[/data/app/~~f23eg9s3HO-H1f5vyz9yqw==/com.example.ruc_flutter-VO7Qr3chQxbW1v_Vz-0G_Q==/lib/arm64, /data/app/~~f23eg9s3HO-H1f5vyz9yqw==/com.example.ruc_flutter-VO7Qr3chQxbW1v_Vz-0G_Q==/base.apk!/lib/arm64-v8a, /system/lib64, /system/system_ext/lib64]]
            at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:259)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:637)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
            at java.lang.reflect.Executable.getParameterTypesInternal(Native Method) 
            at java.lang.reflect.Method.getParameterTypes(Method.java:186) 
            at org.greenrobot.eventbus.SubscriberMethodFinder.findUsingReflectionInSingleClass(SubscriberMethodFinder.java:173) 
            at org.greenrobot.eventbus.SubscriberMethodFinder.findUsingInfo(SubscriberMethodFinder.java:88) 
            at org.greenrobot.eventbus.SubscriberMethodFinder.findSubscriberMethods(SubscriberMethodFinder.java:64) 
            at org.greenrobot.eventbus.EventBus.register(EventBus.java:150) 
            at com.example.ruc_flutter.MainActivity.onStart(MainActivity.kt:45) 
            at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1455) 
            at android.app.Activity.performStart(Activity.java:8315) 
            at android.app.ActivityThread.handleStartActivity(ActivityThread.java:4136) 
            at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221) 
            at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201) 
            at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173) 
            at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2443) 
            at android.os.Handler.dispatchMessage(Handler.java:106) 
            at android.os.Looper.loopOnce(Looper.java:226) 
            at android.os.Looper.loop(Looper.java:313) 
            at android.app.ActivityThread.main(ActivityThread.java:8751) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135) 

 

We did check the following before coming to SO

  • proguard is disabled, we enabled it once to pass -donotwarn directive for BackEvent class
  • Override onBackPressed (deprecated) and did the alternate implementation provided as per Android (no luck)
  • We pass, this as argument, this.context ... no luck

Can someone help us understand what are we missing out or overlooking ?

Share Improve this question edited Jan 3 at 2:21 Naval Patel asked Jan 2 at 13:56 Naval PatelNaval Patel 11 bronze badge
Add a comment  | 

1 Answer 1

Reset to default 0

Just register that Subscriber through a different class and not from MainActivity,

make a class EventLogger.java

public class EventLogger {

public static final String TAG = EventLogger.class.getSimpleName();

public EventLogger() {
    MySDK.getEventBus().register(this);
}

@Subscribe(threadMode = ThreadMode.MAIN)
public void onSomeEvent(SomeEvent event) {
    Log.d(TAG, "onLocationChangeEvent Started " + event.toString());
    MainActivity.Companion.getEventSink().success("The event is triggered");
    Log.d(TAG, "SomeEvent Ended");
}
public void unregister() {
    EventBus.getDefault().unregister(this);
   } 
}

Make sure to have a public constructor through which you can send back the event triggers in Flutter Event Channel

class MainActivity: FlutterActivity() {
    companion object {
    var eventSink: EventChannel.EventSink? = null
}

    private lateinit var eventLogger: EventLogger

    override fun onDestroy() {
        eventLogger.unregister()
        super.onDestroy()
    }

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
    super.configureFlutterEngine(flutterEngine)

    eventLogger = EventLogger()

    
     EventChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL_EVENTS).setStreamHandler(object : EventChannel.StreamHandler{
        override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {
            Log.i(TAG, "GT LOGGER => Event Channel for flutter is triggered")
            eventSink = events

        }

        override fun onCancel(arguments: Any?) {
            eventSink = null
        }
      })
    }
}
转载请注明原文地址:http://anycun.com/QandA/1746116391a91897.html