Flutter中使用Matrix包实现屏幕共享时应用崩溃求助
问题描述
我正在使用适用于实时通信的matrix包,已实现语音通话、视频通话及实时消息发送功能。尝试在通话中实现屏幕共享时,虽有默认方法可用,但启动屏幕共享时应用崩溃。
我使用的代码如下:
Future<void> handleScreenSharing() async { screenShared.toggle(); await _groupCall?.setScreensharingEnabled( screenShared.value, groupCall.localDesktopCapturerSourceId, ); }
崩溃报错:
解决方案
从报错截图看,是空指针异常(Null check operator used on a null value),可从以下几个方向排查修复:
修复空实例访问问题
代码中_groupCall用了空安全调用?.,但后续直接访问groupCall.localDesktopCapturerSourceId未做空判断,若groupCall实例为空会直接崩溃。统一做空安全校验:Future<void> handleScreenSharing() async { screenShared.toggle(); if (_groupCall == null) return; await _groupCall!.setScreensharingEnabled( screenShared.value, _groupCall!.localDesktopCapturerSourceId, ); }确保桌面捕获源ID已初始化
localDesktopCapturerSourceId未获取到有效ID就调用屏幕共享,也会引发崩溃。需先获取可用的屏幕/窗口源:// 先获取桌面捕获源列表 Future<void> loadDesktopSources() async { if (_groupCall == null) return; final sources = await _groupCall!.getDesktopCapturerSources(); // 可让用户选择源,此处默认取第一个示例 if (sources.isNotEmpty) { _groupCall!.localDesktopCapturerSourceId = sources.first.id; } } // 调用屏幕共享前校验源ID Future<void> handleScreenSharing() async { if (_groupCall == null || _groupCall!.localDesktopCapturerSourceId == null) { await loadDesktopSources(); if (_groupCall?.localDesktopCapturerSourceId == null) return; } screenShared.toggle(); await _groupCall!.setScreensharingEnabled( screenShared.value, _groupCall!.localDesktopCapturerSourceId!, ); }检查平台权限
屏幕共享需要对应平台权限:- Android:需在Manifest中声明
RECORD_AUDIO、MEDIA_CONTENT_CONTROL等权限,并动态申请;Android 10+额外需要ACCESS_MEDIA_LOCATION。 - iOS:在Info.plist中添加
NSScreenCaptureUsageDescription权限描述。 - 桌面端:确保系统已授予屏幕录制权限。
- Android:需在Manifest中声明
升级matrix包版本
旧版本可能存在屏幕共享相关bug,尝试升级至最新稳定版。
内容的提问来源于stack exchange,提问作者Ruban
相关产品推荐
相关产品推荐

