调用flutter_background_service的stopSelf为何导致flutter_vlc_player崩溃?
解决flutter_vlc_player停止后台服务后切换页面的Channel连接错误
问题背景
使用flutter_background_service:4.0.0和flutter_vlc_player:7.2.0开发Android应用,在MyHomePage页面调用ServiceInstance.stopSelf()后切换页面,VLC播放器抛出PlatformException(channel-error, Unable to establish connection on channel., null, null)错误,常规的flutter clean、依赖升级降级等操作无效。
可行解决方案
销毁播放器实例再停止服务
错误核心是后台服务停止时,VLC的Native通道未被正确释放,页面切换后通道通信中断。在调用停止服务前,先销毁播放器实例:// 按钮点击事件示例 onPressed: () async { await _videoPlayerController.dispose(); await ServiceInstance.stopSelf(); Navigator.push(context, MaterialPageRoute(builder: (_) => NewPage())); }页面销毁时强制清理VLC通道
在MyHomePage的dispose方法中,添加针对Android平台的通道清理逻辑,确保所有播放器资源被释放:@override void dispose() { _videoPlayerController?.dispose(); if (Platform.isAndroid) { const MethodChannel('xyz.amr.flutter.vlc_player').invokeMethod('disposeAllPlayers'); } super.dispose(); }延迟服务停止时机
利用WidgetsBinding的帧回调,等待页面资源完全释放后再停止服务,避免通道资源竞争:onPressed: () async { await _videoPlayerController.dispose(); WidgetsBinding.instance.addPostFrameCallback((_) async { await ServiceInstance.stopSelf(); Navigator.pushReplacement(context, MaterialPageRoute(builder: (_) => NewPage())); }); }检查服务初始化逻辑
确保flutter_background_service的初始化没有与VLC播放器的通道实例产生绑定,服务应独立管理自身资源,不要复用页面内的播放器相关通道。
内容的提问来源于stack exchange,提问作者rel
相关产品推荐
相关产品推荐

