click_with_music_controller.dart 1.32 KB
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<void> playMusicAndPerformAction(BuildContext? context,
      AudioPlayerUtilType audioType, FutureOr<void> 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 dispose() {
  //   _audioPlayer.dispose();
  // }
}