Flutter中使用just_audio实现应用退至后台时停止音频
实现应用退至后台时停止just_audio播放的最简方案
无需额外依赖,直接利用Flutter自带的应用生命周期监听能力即可实现,步骤如下:
- 让页面的State类混入
WidgetsBindingObserver,用于监听应用状态变化 - 在
initState中注册生命周期监听,在dispose中取消监听并释放播放器资源 - 重写
didChangeAppLifecycleState方法,根据应用状态控制播放器停止
代码示例
class MusicPlayerPage extends StatefulWidget { const MusicPlayerPage({super.key}); @override State<MusicPlayerPage> createState() => _MusicPlayerPageState(); } class _MusicPlayerPageState extends State<MusicPlayerPage> with WidgetsBindingObserver { late AudioPlayer _audioPlayer; @override void initState() { super.initState(); _audioPlayer = AudioPlayer(); // 注册生命周期监听 WidgetsBinding.instance.addObserver(this); // 初始化音频源 _loadAudioSource(); } Future<void> _loadAudioSource() async { await _audioPlayer.setUrl('你的音频文件地址或网络链接'); } @override void dispose() { // 移除监听 WidgetsBinding.instance.removeObserver(this); // 释放播放器资源 _audioPlayer.dispose(); super.dispose(); } @override void didChangeAppLifecycleState(AppLifecycleState state) { super.didChangeAppLifecycleState(state); // 应用退至后台(暂停/非活跃状态)时停止播放 if (state == AppLifecycleState.paused || state == AppLifecycleState.inactive) { _audioPlayer.stop(); } // 可选:应用回到前台时恢复播放,按需开启 // if (state == AppLifecycleState.resumed) { // _audioPlayer.play(); // } } @override Widget build(BuildContext context) { return Scaffold( body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ ElevatedButton( onPressed: () => _audioPlayer.play(), child: const Text('开始播放'), ), const SizedBox(height: 16), ElevatedButton( onPressed: () => _audioPlayer.pause(), child: const Text('暂停播放'), ), ], ), ), ); } }
这个方案的核心是通过WidgetsBindingObserver监听应用的生命周期状态,当检测到应用进入后台(paused或inactive状态)时,直接调用just_audio播放器的stop()方法终止音频播放,完全不需要引入audio_service或just_audio_background插件。
内容的提问来源于stack exchange,提问作者raphheuhh
相关产品推荐
相关产品推荐

