1- import 'package:app/extensions/assets_audio_player.dart' ;
21import 'package:app/extensions/duration.dart' ;
32import 'package:app/mixins/stream_subscriber.dart' ;
3+ import 'package:app/models/song.dart' ;
44import 'package:app/providers/audio_provider.dart' ;
5- import 'package:app/providers/song_provider.dart' ;
65import 'package:flutter/material.dart' ;
76import 'package:provider/provider.dart' ;
87
98class 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);
1112
1213 _ProgressBarState createState () => _ProgressBarState ();
1314}
1415
1516class _ProgressBarState extends State <ProgressBar > with StreamSubscriber {
1617 late final AudioProvider audio;
17- late final SongProvider songProvider;
18-
1918 late Duration _duration, _position;
2019
2120 TextStyle timeStampStyle = const TextStyle (
@@ -27,19 +26,25 @@ class _ProgressBarState extends State<ProgressBar> with StreamSubscriber {
2726 void initState () {
2827 super .initState ();
2928 audio = context.read ();
30- songProvider = context.read ();
3129
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 ()));
3731
3832 subscribe (audio.player.currentPosition.listen ((position) {
3933 setState (() => _position = position);
4034 }));
4135 }
4236
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+
4348 @override
4449 void dispose () {
4550 unsubscribeAll ();
0 commit comments