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; 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 { if (_isPlaying) return; _isPlaying = true; Log.d("WQF playMusicAndPerformAction playAudio begin"); // Play the music await AudioPlayerUtil.getInstance() .playAudio(audioType); try { await Future.sync(action); } catch (e) { Log.d('WQF playMusicAndPerformAction exception $e'); } finally { Log.d("WQF playMusicAndPerformAction playAudio end"); _isPlaying = false; } } void reset() { _isPlaying = false; } // void dispose() { // _audioPlayer.dispose(); // } }