You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter集成Android原生时EventChannel.EventSink始终为空的问题

问题解决思路及代码调整

核心原因

你的onListen和onCancel未被调用,本质是Dart侧没有对指定的EventChannel建立流监听,导致原生侧的StreamHandler从未被激活,attachEvent自然一直为null。

分步解决

1. 补全Dart侧的流监听代码

在Flutter Dart代码中,必须主动监听对应通道的流,原生侧的onListen才会触发。示例代码如下:

import 'package:flutter/services.dart';

class LocationStream {
  static const EventChannel _locationChannel = EventChannel('com.example.locationconnectivity');
  
  static Stream<String> get locationUpdates {
    return _locationChannel.receiveBroadcastStream().map((event) => event.toString());
  }
}

// 在页面中初始化监听
@override
void initState() {
  super.initState();
  LocationStream.locationUpdates.listen((location) {
    print('收到位置更新:$location');
    // 这里处理位置数据
  }, onError: (error) {
    print('位置监听出错:$error');
  });
}

2. 核对通道名称一致性

确保Dart侧EventChannel的名称和原生侧networkEventChannel的字符串完全一致,包括大小写、包名前缀,不能有任何拼写错误。

3. 优化原生侧代码逻辑

调整MainActivity代码,增加空安全检查和调试日志,让位置更新逻辑更健壮:

class MainActivity : FlutterFragmentActivity(), LocationCallback {
    private val networkEventChannel = "com.example.locationconnectivity"
    private var attachEvent: EventChannel.EventSink? = null

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

        EventChannel(
            flutterEngine.dartExecutor.binaryMessenger,
            networkEventChannel
        ).setStreamHandler(object : EventChannel.StreamHandler {
            override fun onListen(args: Any?, events: EventChannel.EventSink) {
                Log.w("TAG_NAME", "监听器已绑定")
                attachEvent = events
                // 可选:主动通知Dart侧监听已启动
                // attachEvent?.success("位置监听已启动")
            }

            override fun onCancel(args: Any?) {
                Log.w("TAG_NAME", "监听器已取消")
                attachEvent = null
            }
        })
    }

    override fun onLocationUpdated(latitude: Double, longitude: Double) {
        runOnUiThread {
            Log.i("attacheventis", "当前EventSink状态:${attachEvent}")
            Toast.makeText(this, "Lat lng ${latitude} ${longitude}", Toast.LENGTH_SHORT).show()
            
            attachEvent?.let { sink ->
                sink.success("${latitude} ${longitude}")
            } ?: run {
                Log.e("TAG_NAME", "EventSink为空,无法发送位置更新")
            }
        }
    }
}

4. 额外检查点

  • 确保MainActivity在AndroidManifest.xml中正确注册,且使用FlutterFragmentActivity:
    <activity
        android:name=".MainActivity"
        android:launchMode="singleTop"
        android:theme="@style/LaunchTheme"
        android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
        android:hardwareAccelerated="true"
        android:windowSoftInputMode="adjustResize">
        <!-- 其他默认配置 -->
    </activity>
    
  • 若位置Service独立启动,需确保MainActivity处于活跃状态时才接收回调,避免Activity销毁后尝试调用attachEvent。

内容的提问来源于stack exchange,提问作者BraveEvidence

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 07:26:20