Blame view

lib/common/widgets/record_playback_widget.dart 3.79 KB
d4d91cb0   吴启风   feat:lottie动效组件封装...
1
2
3
4
5
6
7
  import 'package:flutter/material.dart';
  import 'package:lottie/lottie.dart';
  import 'package:wow_english/common/widgets/throttledGesture_gesture_detector.dart';
  
  import '../../utils/log_util.dart';
  
  /// 录音组件
0ebc6186   吴启风   feat:解决异步场景下setSt...
8
  class RecorderPlaybackWidget extends StatefulWidget {
d4d91cb0   吴启风   feat:lottie动效组件封装...
9
10
11
12
13
14
    final bool isClickable;
    final bool isPlaying;
    final VoidCallback? onTap;
    final double width;
    final double height;
  
0ebc6186   吴启风   feat:解决异步场景下setSt...
15
    const RecorderPlaybackWidget({
d4d91cb0   吴启风   feat:lottie动效组件封装...
16
17
18
19
20
21
22
23
24
      Key? key,
      required this.isClickable,
      required this.isPlaying,
      required this.onTap,
      required this.width,
      required this.height,
    }) : super(key: key);
  
    @override
0ebc6186   吴启风   feat:解决异步场景下setSt...
25
    _RecorderPlaybackWidgetState createState() => _RecorderPlaybackWidgetState();
d4d91cb0   吴启风   feat:lottie动效组件封装...
26
27
  }
  
0ebc6186   吴启风   feat:解决异步场景下setSt...
28
  class _RecorderPlaybackWidgetState extends State<RecorderPlaybackWidget>
d4d91cb0   吴启风   feat:lottie动效组件封装...
29
30
      with SingleTickerProviderStateMixin {
    late final AnimationController _controller;
0ebc6186   吴启风   feat:解决异步场景下setSt...
31
    late final Future<LottieComposition> _futureComposition;
642081ad   吴启风   feat:lottie动画加载优化...
32
    static const String TAG = "RecorderPlaybackWidget";
d4d91cb0   吴启风   feat:lottie动效组件封装...
33
34
35
36
37
38
39
40
  
    bool _isPlaying = false;
  
    @override
    void initState() {
      super.initState();
      _controller = AnimationController(vsync: this);
      _loadComposition();
0ebc6186   吴启风   feat:解决异步场景下setSt...
41
42
43
      if (widget.isPlaying) {
        _playAnimation();
      }
d4d91cb0   吴启风   feat:lottie动效组件封装...
44
45
46
47
48
49
  
      _controller.addListener(() {
        // Log.d("$TAG addListener _controller=${_controller.status}");
      });
    }
  
0ebc6186   吴启风   feat:解决异步场景下setSt...
50
51
52
53
54
55
56
57
58
    @override
    void didUpdateWidget(RecorderPlaybackWidget oldWidget) {
      super.didUpdateWidget(oldWidget);
      Log.d(
          "$TAG ${identityHashCode(this)} didUpdateWidget widget=${widget.isPlaying} oldWidget=${oldWidget.isPlaying} _isPlaying=$_isPlaying");
      if (widget.isPlaying && !_isPlaying) {
        setState(() {
          _isPlaying = true;
        });
d4d91cb0   吴启风   feat:lottie动效组件封装...
59
        _playAnimation();
0ebc6186   吴启风   feat:解决异步场景下setSt...
60
61
62
63
64
65
      } else if (!widget.isPlaying && _isPlaying) {
        _stopAnimation();
      }
  
      if (!_isPlaying) {
        _displayAnimation(widget.isClickable);
d4d91cb0   吴启风   feat:lottie动效组件封装...
66
67
68
      }
    }
  
0ebc6186   吴启风   feat:解决异步场景下setSt...
69
70
71
72
    Future<void> _loadComposition() async {
      _futureComposition = AssetLottie('assets/lotties/recorder_back.zip').load();
    }
  
d4d91cb0   吴启风   feat:lottie动效组件封装...
73
74
    void _playAnimation() {
      _controller.reset();
0ebc6186   吴启风   feat:解决异步场景下setSt...
75
76
77
78
79
80
81
      _futureComposition.then((composition) {
        _controller.duration = composition.duration;
        _controller.repeat(
          min: 2 / composition.endFrame,
          max: 20 / composition.endFrame,
        );
      });
d4d91cb0   吴启风   feat:lottie动效组件封装...
82
83
84
85
    }
  
    void _stopAnimation() {
      _controller.stop();
0ebc6186   吴启风   feat:解决异步场景下setSt...
86
87
88
89
90
91
92
93
94
95
96
97
      if (mounted) {
        setState(() {
          _isPlaying = false;
          _futureComposition.then((composition) {
            _controller.value = 1 / composition.endFrame;
          });
          // _controller.repeat(
          //   min: 1 / _composition.endFrame,
          //   max: 1 / _composition.endFrame,
          // );
        });
      }
d4d91cb0   吴启风   feat:lottie动效组件封装...
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
    }
  
    void _displayAnimation(bool clickable) {
      if (clickable) {
        _controller.value = 1;
        // _controller.repeat(
        //   min: 1,
        //   max: 1,
        // );
      } else {
        _controller.value = 0;
        // _controller.repeat(
        //   min: 0,
        //   max: 0,
        // );
      }
    }
  
    @override
d4d91cb0   吴启风   feat:lottie动效组件封装...
117
118
119
120
121
122
123
124
125
126
127
    void dispose() {
      _controller.dispose();
      super.dispose();
    }
  
    @override
    Widget build(BuildContext context) {
      return ThrottledGestureDetector(
        onTap: widget.isClickable ? widget.onTap : null,
        child: Opacity(
          opacity: widget.isClickable ? 1.0 : 0.5, // 设置透明度
0ebc6186   吴启风   feat:解决异步场景下setSt...
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
          child: FutureBuilder<LottieComposition>(
              future: _futureComposition,
              builder: (context, snapshot) {
                if (snapshot.hasData) {
                  final composition = snapshot.data!;
                  return Lottie(
                    composition: composition,
                    controller: _controller,
                    renderCache: RenderCache.raster,
                    width: widget.width,
                    height: widget.height,
                  );
                } else {
                  return const SizedBox.shrink();
                }
              }),
d4d91cb0   吴启风   feat:lottie动效组件封装...
144
145
146
147
        ),
      );
    }
  }