【问题标题】:Failed to open event stream on Flutter's EventChannel ( Parameter specified as non-null is null)在 Flutter 的 EventChannel 上打开事件流失败(指定为非空的参数为空)
【发布时间】:2021-02-02 21:34:08
【问题描述】:

这是我的 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")
                }
            }
    )

然后在 Flutter 上我这样打开它:

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

然后在initState:

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

我得到了什么:

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)

看起来onListen 正在使用空数据调用。但我不传递任何数据。发生了什么事?

【问题讨论】:

    标签: android flutter kotlin dart


    【解决方案1】:

    只需在args: Any 上添加?,它看起来像这样:args: Any?,例如:

    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")
                    }
                }
        )
    

    这样它将接受空参数。以前的方式是强制 args 为非空,但是当颤振打开一个没有任何名称的频道时,像

    widget.stream.receiveBroadcastStream()
    

    它向该代码发送一个空参数。另一种解决方案是发送一些东西:

    widget.stream.receiveBroadcastStream("something")
    

    但如果您不希望有任何参数,最好让Any 为空

    【讨论】:

      猜你喜欢
      • 2017-12-06
      • 1970-01-01
      • 2021-12-09
      • 2020-05-06
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      相关资源
      最近更新 更多