Failed to open event stream on Flutter's EventChannel ( Parameter specified as non-null is null)

566

Just add ? on args: Any so it looks like this: args: Any?, example:

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

    EventChannel(flutterEngine.dartExecutor.binaryMessenger, EVENT_CHANNEL).setStreamHandler(
            object : EventChannel.StreamHandler {
                override fun onListen(args: Any?, events: EventChannel.EventSink) {
                    Log.d(TAG, "adding listener for $EVENT_CHANNEL")
                    events.success(true)
                }

                override fun onCancel(args: Any?) {
                    Log.d(TAG, "cancelling listener for $EVENT_CHANNEL")
                }
            }
    )

This way it will accept null args. The way it was before was forcing args to be non null, but when flutter opens a channel without any name like

widget.stream.receiveBroadcastStream()

it sends a null arg to that code. Another solution would be to send something:

widget.stream.receiveBroadcastStream("something")

but it's better to make the possibility for Any to be null if you might expect no parameters

Share:
566
Margareth Reena
Author by

Margareth Reena

Updated on December 27, 2022

Comments

  • Margareth Reena
    Margareth Reena over 1 year

    Here's my MainActivity.kt:

    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
    
        EventChannel(flutterEngine.dartExecutor.binaryMessenger, EVENT_CHANNEL).setStreamHandler(
                object : EventChannel.StreamHandler {
                    override fun onListen(args: Any, events: EventChannel.EventSink) {
                        Log.d(TAG, "adding listener for $EVENT_CHANNEL")
                        events.success(true)
                    }
    
                    override fun onCancel(args: Any) {
                        Log.d(TAG, "cancelling listener for $EVENT_CHANNEL")
                    }
                }
        )
    

    Then on Flutter I open it like this:

      final stream = const EventChannel('com.my_app.event_channel');
    

    Then on initState:

    widget.stream.receiveBroadcastStream().listen((event) {
      print("@@@@@@@@@@@@@@@@@@@@@@@@@@ received event channel!");
    });
    

    What I get:

    E/EventChannel#com.my_app.event_channel(16346): Failed to open event stream
    E/EventChannel#com.my_app.event_channel(16346): java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter args
    E/EventChannel#com.my_app.event_channel(16346):     at com.my_app.flutter_app.MainActivity$configureFlutterEngine$1.onListen(Unknown Source:2)
    E/EventChannel#com.my_app.event_channel(16346):     at io.flutter.plugin.common.EventChannel$IncomingStreamRequestHandler.onListen(EventChannel.java:188)
    E/EventChannel#com.my_app.event_channel(16346):     at io.flutter.plugin.common.EventChannel$IncomingStreamRequestHandler.onMessage(EventChannel.java:167)
    E/EventChannel#com.my_app.event_channel(16346):     at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:85)
    E/EventChannel#com.my_app.event_channel(16346):     at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:692)
    E/EventChannel#com.my_app.event_channel(16346):     at android.os.MessageQueue.nativePollOnce(Native Method)
    E/EventChannel#com.my_app.event_channel(16346):     at android.os.MessageQueue.next(MessageQueue.java:325)
    E/EventChannel#com.my_app.event_channel(16346):     at android.os.Looper.loop(Looper.java:142)
    E/EventChannel#com.my_app.event_channel(16346):     at android.app.ActivityThread.main(ActivityThread.java:6617)
    E/EventChannel#com.my_app.event_channel(16346):     at java.lang.reflect.Method.invoke(Native Method)
    E/EventChannel#com.my_app.event_channel(16346):     at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    E/EventChannel#com.my_app.event_channel(16346):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769)
    

    Looks like onListen is being called with null data. But I do not pass any data. What's happening?