click_with_music_controller.dart 1.64 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;

  static String TAG = 'ClickWithMusicController';

  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 {
    Log.d("$TAG playMusicAndPerformAction _isPlaying=$_isPlaying");
    ///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<void> reset() async {
    _isPlaying = false;
    await AudioPlayerUtil.getInstance().stop();
  }

  // void dispose() {
  //   _audioPlayer.dispose();
  // }
}