Flutter新建x86安卓模拟器后运行代码出现ExoPlayer相关报错
问题排查方向
- 你贴出的运行日志全部是ExoPlayer音视频组件、AudioTrack音频输出相关的系统级提示,其中的警告是x86架构API29模拟器镜像的通用兼容问题,和你贴出的按钮点击逻辑没有关联,不需要在这部分日志里定位问题。
- 代码逻辑本身存在未闭环的状态缺陷,此前在旧模拟器上可运行属于状态未触发的巧合:
- 点击回调中对
_loading的判断是平级if语句,不存在互斥逻辑,第一次点击时setState标记_loading = true后,会立刻命中后续_loading == true的判断分支,和你预期的执行顺序不符。 - 所有Timer延时逻辑中,没有任何一处将
_loading状态重置为false,第一次点击执行完成后,_loading会永久为true,后续点击按钮永远不会进入核心执行逻辑。
- 点击回调中对
- 新模拟器环境存在兼容风险:
- 32位x86架构的Android模拟器镜像对Flutter的Timer、动画回调时序支持存在已知问题,若未开启硬件加速,很容易出现延时回调乱序、动画状态不刷新的问题。
- 更换模拟器后未清除旧构建缓存,可能存在原生依赖和当前模拟器架构不匹配的问题。
- 若你在新模拟器的开发者选项中关闭了系统动画,
AnimatedOpacity的状态回调会出现异常,可能导致按钮点击区域不响应。
解决方案
- 第一步:过滤无效日志,直接忽略ExoPlayer、AudioTrack相关的提示输出,这类日志不影响业务逻辑运行。
- 第二步:修复按钮点击的逻辑缺陷,重构onPressed回调为提前返回的互斥逻辑,补全
_loading状态重置,参考修改如下:
onPressed: () { print("go button clicked"); // 不满足点击条件时提前返回,避免后续逻辑误执行 if (!_clickGoButton) { print("3 saniye bekle amk."); return; } if (_loading) { print("not loading because loading is true."); return; } setState(() { _loading = true; }); Timer(const Duration(milliseconds: 650), () { setState(() { ezAnimation.reverse(); _secureAndHiddenImage = false; }); }); Timer(const Duration(milliseconds: 1200), () { setState(() { _secureAndHiddenHeaders = false; _secureAndHiddenContent = false; }); }); Timer(const Duration(milliseconds: 1800), () { setState(() { _goButton = false; }); }); Timer(const Duration(milliseconds: 2200), () { setState(() { PaginationController.pageNumber.value = 3; _loading = false; // 补全加载状态重置,避免后续点击被拦截 }); }); }
- 第三步:调整模拟器配置排除环境问题:
- 建议删除当前32位x86的API29镜像,创建x86_64架构的API30及以上版本模拟器,在模拟器高级设置中将图形渲染选项改为
Hardware - GLES 2.0,开启硬件加速保证动画、计时器回调时序正常。 - 重新构建前执行
flutter clean清除旧构建缓存,再执行flutter pub get拉取对应架构的原生依赖,不要使用热重载/热重启,全量安装应用到新模拟器验证。 - 打开模拟器开发者选项,将窗口动画缩放、过渡动画缩放、Animator时长缩放全部设置为1x,不要关闭系统动画,避免
AnimatedOpacity组件状态异常。
- 建议删除当前32位x86的API29镜像,创建x86_64架构的API30及以上版本模拟器,在模拟器高级设置中将图形渲染选项改为
- 第四步:若按钮存在透明状态下无法点击的问题,给
AnimatedOpacity组件添加参数alwaysIncludeSemantics: true,保证显示状态下按钮的语义节点正常响应点击。
内容的提问来源于stack exchange,提问作者Emir Bolat
相关产品推荐
相关产品推荐

