Blame view

lib/common/utils/click_with_music_controller.dart 1.66 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
  
819ae43b   吴启风   feat:体验优化-练习题目取消阻...
14
15
    static String TAG = 'ClickWithMusicController';
  
0493c104   吴启风   feat:带音乐点击防抖函数优化
16
17
18
    ClickWithMusicController._privateConstructor();
  
    static ClickWithMusicController get instance => _instance ??= ClickWithMusicController._privateConstructor();
cd32eb01   吴启风   feat:播放音乐防抖处理(课程环节页)
19
20
21
  
    bool _isPlaying = false;
  
37063ced   吴启风   feat:阶段选择指示器与阶段色联...
22
    ///@param context 暂时没用到,先可空预留
0493c104   吴启风   feat:带音乐点击防抖函数优化
23
    ///@param action 可以是同步函数也可以是异步函数
37063ced   吴启风   feat:阶段选择指示器与阶段色联...
24
    Future<void> playMusicAndPerformAction(BuildContext? context,
0493c104   吴启风   feat:带音乐点击防抖函数优化
25
        AudioPlayerUtilType audioType, FutureOr<void> Function() action) async {
457ac447   吴启风   feat:代码优化-空条件调用
26
      Log.d("$TAG playMusicAndPerformAction _isPlaying=$_isPlaying audioType=$audioType");
819ae43b   吴启风   feat:体验优化-练习题目取消阻...
27
      ///todo 是否需要考虑打断覆盖能力
cd32eb01   吴启风   feat:播放音乐防抖处理(课程环节页)
28
29
30
      if (_isPlaying) return;
  
      _isPlaying = true;
819ae43b   吴启风   feat:体验优化-练习题目取消阻...
31
      Log.d("$TAG playMusicAndPerformAction playAudio begin");
cd32eb01   吴启风   feat:播放音乐防抖处理(课程环节页)
32
  
819ae43b   吴启风   feat:体验优化-练习题目取消阻...
33
      await AudioPlayerUtil.getInstance().pause();
cd32eb01   吴启风   feat:播放音乐防抖处理(课程环节页)
34
35
36
37
      // Play the music
      await AudioPlayerUtil.getInstance()
          .playAudio(audioType);
  
0493c104   吴启风   feat:带音乐点击防抖函数优化
38
39
40
      try {
        await Future.sync(action);
      } catch (e) {
819ae43b   吴启风   feat:体验优化-练习题目取消阻...
41
        Log.d('$TAG playMusicAndPerformAction exception $e');
0493c104   吴启风   feat:带音乐点击防抖函数优化
42
      } finally {
819ae43b   吴启风   feat:体验优化-练习题目取消阻...
43
        Log.d("$TAG playMusicAndPerformAction playAudio end");
0493c104   吴启风   feat:带音乐点击防抖函数优化
44
45
        _isPlaying = false;
      }
cd32eb01   吴启风   feat:播放音乐防抖处理(课程环节页)
46
47
    }
  
819ae43b   吴启风   feat:体验优化-练习题目取消阻...
48
    Future<void> reset() async {
0427feeb   吴启风   feat:增加播放器对页面生命周期...
49
      _isPlaying = false;
819ae43b   吴启风   feat:体验优化-练习题目取消阻...
50
      await AudioPlayerUtil.getInstance().stop();
0427feeb   吴启风   feat:增加播放器对页面生命周期...
51
52
    }
  
cd32eb01   吴启风   feat:播放音乐防抖处理(课程环节页)
53
54
55
56
    // void dispose() {
    //   _audioPlayer.dispose();
    // }
  }