1
- import 'package:app/extensions/assets_audio_player.dart' ;
2
1
import 'package:app/extensions/duration.dart' ;
3
2
import 'package:app/mixins/stream_subscriber.dart' ;
3
+ import 'package:app/models/song.dart' ;
4
4
import 'package:app/providers/audio_provider.dart' ;
5
- import 'package:app/providers/song_provider.dart' ;
6
5
import 'package:flutter/material.dart' ;
7
6
import 'package:provider/provider.dart' ;
8
7
9
8
class ProgressBar extends StatefulWidget {
10
- const ProgressBar ({Key ? key}) : super (key: key);
9
+ final Song song;
10
+
11
+ const ProgressBar ({Key ? key, required this .song}) : super (key: key);
11
12
12
13
_ProgressBarState createState () => _ProgressBarState ();
13
14
}
14
15
15
16
class _ProgressBarState extends State <ProgressBar > with StreamSubscriber {
16
17
late final AudioProvider audio;
17
- late final SongProvider songProvider;
18
-
19
18
late Duration _duration, _position;
20
19
21
20
TextStyle timeStampStyle = const TextStyle (
@@ -27,19 +26,25 @@ class _ProgressBarState extends State<ProgressBar> with StreamSubscriber {
27
26
void initState () {
28
27
super .initState ();
29
28
audio = context.read ();
30
- songProvider = context.read ();
31
29
32
- setState (() {
33
- _duration = Duration (
34
- seconds: songProvider.byId (audio.player.songId! ).length.toInt (),
35
- );
36
- });
30
+ setState (() => _duration = Duration (seconds: widget.song.length.toInt ()));
37
31
38
32
subscribe (audio.player.currentPosition.listen ((position) {
39
33
setState (() => _position = position);
40
34
}));
41
35
}
42
36
37
+ /// Since this widget is rendered inside NowPlayingScreen, change to current
38
+ /// song in the parent will not trigger initState() and as a result not
39
+ /// refresh the progress bar's values.
40
+ /// For that, we hook into didUpdateWidget().
41
+ /// See https://stackoverflow.com/questions/54759920/flutter-why-is-child-widgets-initstate-is-not-called-on-every-rebuild-of-pa.
42
+ @override
43
+ void didUpdateWidget (covariant ProgressBar oldWidget) {
44
+ super .didUpdateWidget (oldWidget);
45
+ setState (() => _duration = Duration (seconds: widget.song.length.toInt ()));
46
+ }
47
+
43
48
@override
44
49
void dispose () {
45
50
unsubscribeAll ();
0 commit comments