Flutter使用Sendbird SDK发送文件遇RequestFailedException(800220)错误求助
问题
在Flutter中使用Sendbird聊天SDK发送文件时,调用voidSendFile()函数触发以下错误:
RequestFailedException(800220): Null check operator used on a null value when sending file using flutter chat sdk
错误由代码中的print("Error here $e");语句输出。已确认groupChannel和channelUrl不为空,该功能在安卓真机上运行正常,但在模拟器调试时出现此问题。
核心代码如下:
GroupChannel? groupChannel; final channelUrl = Get.parameters['channel_url']!; @override void initState() { super.initState(); GroupChannel.getChannel(channelUrl).then((channel) { groupChannel = channel; }); } voidSendFile() { try { FileMessageCreateParams? params; params = FileMessageCreateParams.withFile( File(filePath!), fileName: textEditingController.text, ); if (params != null) { groupChannel!.sendFileMessage( params, handler: (message, e) async { print("Error here $e"); //error here }, progressHandler: (sentBytes, totalBytes) { print("progress $sentBytes $totalBytes"); setState(() { uploadProgressValue = (sentBytes / totalBytes); }); }, ); } } catch (err) { print("this is error voidSendFile $err"); } }
解决方案
- 验证文件路径与模拟器权限
模拟器的文件系统权限逻辑和真机存在差异,先打印filePath的具体值,手动在模拟器的文件管理器中确认该路径下的文件真实存在,同时确保应用已申请并获得文件读取权限。 - 修复异步初始化的竞态问题
模拟器网络请求速度通常慢于真机,可能导致调用voidSendFile()时,GroupChannel.getChannel()的异步操作还未完成。修改初始化逻辑,确保频道加载完成后再允许发送文件:
在@override void initState() { super.initState(); _loadChannel(); } Future<void> _loadChannel() async { groupChannel = await GroupChannel.getChannel(channelUrl); setState(() {}); }voidSendFile()中先检查频道状态:void voidSendFile() { if (groupChannel == null) { print("频道尚未初始化完成"); return; } // 原文件发送逻辑 } - 升级Sendbird SDK版本
部分旧版SDK在模拟器环境下存在空值处理的兼容性bug,将Sendbird Flutter SDK升级到最新稳定版本,大概率能解决此类问题。 - 调整文件对象的构造方式
模拟器中直接使用File(filePath!)可能存在路径解析异常,尝试替换为File.fromUri(Uri.parse(filePath!))来构造文件对象,确保文件实例正确初始化。
内容的提问来源于stack exchange,提问作者wahyu
相关产品推荐
相关产品推荐

