Flutter audio_service从PageManager调用无法更新通知mediaItem怎么办
问题原理说明
这个问题的核心是AudioHandler实例引用不匹配:
audio_service初始化时会生成一个全局唯一的AudioHandler实例,这个实例内置了和系统通知栏的绑定逻辑,只有在这个实例内部操作mediaItem流推送新值,才会触发通知栏的同步刷新。- 你在PageManager中调用
updateMediaItems时,使用的是自己单独实例化的AudioHandler子类对象,或者没有拿到初始化时注册的全局AudioHandler实例,你修改的是这个独立实例的mediaItem,没有和系统通知的监听逻辑关联,所以不会触发通知更新。 - 而在AudioHandler内部的
play()等原生重写方法里调用、或者直接在AudioHandler类内部调用方法,操作的都是已经完成系统绑定的全局实例的mediaItem流,因此可以正常更新通知栏。
修复方案
在PageManager中直接调用全局注册的AudioHandler实例的方法即可,示例代码如下:
import 'package:audio_service/audio_service.dart'; // PageManager中调用逻辑 class PageManager { void changeMediaInfo() { // 获取全局绑定的AudioHandler实例,强转为你自定义的子类类型 final myHandler = AudioService.audioHandler as MyCustomAudioHandler; // 调用更新方法即可触发通知栏刷新 myHandler.updateMediaItems('测试专辑', '测试标题', '测试歌手', 'https://xxx/cover.png'); } }
注意事项
- 要确保
updateMediaItems是你自定义AudioHandler子类的公开方法,外部才能正常调用 - 如果你的MediaItem的id固定不变,部分系统版本可能会做通知复用,建议每次更新时如果媒体内容变化,id也对应做修改
内容的提问来源于stack exchange,提问作者High
相关产品推荐
相关产品推荐

