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
相关产品推荐
相关产品推荐

