import 'dart:async'; import 'package:flutter/material.dart'; import '../../utils/audio_player_util.dart'; import '../../utils/log_util.dart'; /// action前播放音乐控制类,维护状态做防抖处理 /// todo 需要结合生命周期,尤其是在声明周期结束后及时中断,避免action泄漏 class ClickWithMusicController { static ClickWithMusicController? _instance; static String TAG = 'ClickWithMusicController'; ClickWithMusicController._privateConstructor(); static ClickWithMusicController get instance => _instance ??= ClickWithMusicController._privateConstructor(); bool _isPlaying = false; ///@param context 暂时没用到,先可空预留 ///@param action 可以是同步函数也可以是异步函数 Future playMusicAndPerformAction(BuildContext? context, AudioPlayerUtilType audioType, FutureOr Function() action) async { Log.d("$TAG playMusicAndPerformAction _isPlaying=$_isPlaying audioType=$audioType"); ///todo 是否需要考虑打断覆盖能力 if (_isPlaying) return; _isPlaying = true; Log.d("$TAG playMusicAndPerformAction playAudio begin"); await AudioPlayerUtil.getInstance().pause(); // Play the music await AudioPlayerUtil.getInstance() .playAudio(audioType); try { await Future.sync(action); } catch (e) { Log.d('$TAG playMusicAndPerformAction exception $e'); } finally { Log.d("$TAG playMusicAndPerformAction playAudio end"); _isPlaying = false; } } Future reset() async { _isPlaying = false; await AudioPlayerUtil.getInstance().stop(); } // void dispose() { // _audioPlayer.dispose(); // } }