click_with_music_controller.dart
1.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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();
// }
}