Blame view

lib/common/utils/click_with_music_controller.dart 1.26 KB
0493c104   吴启风   feat:带音乐点击防抖函数优化
1
2
  import 'dart:async';
  
cd32eb01   吴启风   feat:播放音乐防抖处理(课程环节页)
3
4
5
  import 'package:flutter/material.dart';
  
  import '../../utils/audio_player_util.dart';
0493c104   吴启风   feat:带音乐点击防抖函数优化
6
  import '../../utils/log_util.dart';
cd32eb01   吴启风   feat:播放音乐防抖处理(课程环节页)
7
8
9
  
  /// action前播放音乐控制类,维护状态做防抖处理
  /// todo 需要结合生命周期,尤其是在声明周期结束后及时中断,避免action泄漏
0493c104   吴启风   feat:带音乐点击防抖函数优化
10
  class ClickWithMusicController {
cd32eb01   吴启风   feat:播放音乐防抖处理(课程环节页)
11
  
0493c104   吴启风   feat:带音乐点击防抖函数优化
12
    static ClickWithMusicController? _instance;
cd32eb01   吴启风   feat:播放音乐防抖处理(课程环节页)
13
  
0493c104   吴启风   feat:带音乐点击防抖函数优化
14
15
16
    ClickWithMusicController._privateConstructor();
  
    static ClickWithMusicController get instance => _instance ??= ClickWithMusicController._privateConstructor();
cd32eb01   吴启风   feat:播放音乐防抖处理(课程环节页)
17
18
19
  
    bool _isPlaying = false;
  
0493c104   吴启风   feat:带音乐点击防抖函数优化
20
    ///@param action 可以是同步函数也可以是异步函数
cd32eb01   吴启风   feat:播放音乐防抖处理(课程环节页)
21
    Future<void> playMusicAndPerformAction(BuildContext context,
0493c104   吴启风   feat:带音乐点击防抖函数优化
22
        AudioPlayerUtilType audioType, FutureOr<void> Function() action) async {
cd32eb01   吴启风   feat:播放音乐防抖处理(课程环节页)
23
24
25
      if (_isPlaying) return;
  
      _isPlaying = true;
0493c104   吴启风   feat:带音乐点击防抖函数优化
26
      Log.d("WQF playMusicAndPerformAction playAudio begin");
cd32eb01   吴启风   feat:播放音乐防抖处理(课程环节页)
27
28
29
30
31
  
      // Play the music
      await AudioPlayerUtil.getInstance()
          .playAudio(audioType);
  
0493c104   吴启风   feat:带音乐点击防抖函数优化
32
33
34
35
36
37
38
39
      try {
        await Future.sync(action);
      } catch (e) {
        Log.d('WQF playMusicAndPerformAction exception $e');
      } finally {
        Log.d("WQF playMusicAndPerformAction playAudio end");
        _isPlaying = false;
      }
cd32eb01   吴启风   feat:播放音乐防抖处理(课程环节页)
40
41
42
43
44
45
    }
  
    // void dispose() {
    //   _audioPlayer.dispose();
    // }
  }