@@ -26,16 +26,15 @@ import 'package:flutter_flip_card/flutter_flip_card.dart';
2626import 'package:musify/API/musify.dart' ;
2727import 'package:musify/extensions/l10n.dart' ;
2828import 'package:musify/main.dart' ;
29- import 'package:musify/models/position_data.dart' ;
3029import 'package:musify/services/settings_manager.dart' ;
3130import 'package:musify/utilities/common_variables.dart' ;
3231import 'package:musify/utilities/flutter_bottom_sheet.dart' ;
3332import 'package:musify/utilities/flutter_toast.dart' ;
34- import 'package:musify/utilities/formatter.dart' ;
3533import 'package:musify/utilities/mediaitem.dart' ;
3634import 'package:musify/utilities/utils.dart' ;
3735import 'package:musify/widgets/marque.dart' ;
3836import 'package:musify/widgets/playback_icon_button.dart' ;
37+ import 'package:musify/widgets/position_slider.dart' ;
3938import 'package:musify/widgets/queue_list_view.dart' ;
4039import 'package:musify/widgets/song_artwork.dart' ;
4140import 'package:musify/widgets/song_bar.dart' ;
@@ -346,92 +345,6 @@ class NowPlayingControls extends StatelessWidget {
346345 }
347346}
348347
349- class PositionSlider extends StatefulWidget {
350- const PositionSlider ({super .key});
351-
352- @override
353- State <PositionSlider > createState () => _PositionSliderState ();
354- }
355-
356- class _PositionSliderState extends State <PositionSlider > {
357- bool _isDragging = false ;
358- double _dragValue = 0 ;
359-
360- @override
361- Widget build (BuildContext context) {
362- final primaryColor = Theme .of (context).colorScheme.primary;
363-
364- return Padding (
365- padding: const EdgeInsets .symmetric (horizontal: 10 ),
366- child: StreamBuilder <PositionData >(
367- stream: audioHandler.positionDataStream,
368- builder: (context, snapshot) {
369- final hasData = snapshot.hasData && snapshot.data != null ;
370- final positionData = hasData
371- ? snapshot.data!
372- : PositionData (Duration .zero, Duration .zero, Duration .zero);
373-
374- final maxDuration = positionData.duration.inSeconds > 0
375- ? positionData.duration.inSeconds.toDouble ()
376- : 1.0 ;
377-
378- final currentValue = _isDragging
379- ? _dragValue
380- : positionData.position.inSeconds.toDouble ();
381-
382- return Column (
383- mainAxisAlignment: MainAxisAlignment .center,
384- children: [
385- Slider (
386- value: currentValue.clamp (0.0 , maxDuration),
387- onChanged: hasData
388- ? (value) {
389- setState (() {
390- _isDragging = true ;
391- _dragValue = value;
392- });
393- }
394- : null ,
395- onChangeEnd: hasData
396- ? (value) {
397- audioHandler.seek (Duration (seconds: value.toInt ()));
398- setState (() {
399- _isDragging = false ;
400- });
401- }
402- : null ,
403- max: maxDuration,
404- ),
405- _buildPositionRow (context, primaryColor, positionData),
406- ],
407- );
408- },
409- ),
410- );
411- }
412-
413- Widget _buildPositionRow (
414- BuildContext context,
415- Color fontColor,
416- PositionData positionData,
417- ) {
418- final positionText = formatDuration (positionData.position.inSeconds);
419- final durationText = formatDuration (positionData.duration.inSeconds);
420- final textStyle = TextStyle (fontSize: 15 , color: fontColor);
421-
422- return Padding (
423- padding: const EdgeInsets .symmetric (horizontal: 22 ),
424- child: Row (
425- mainAxisAlignment: MainAxisAlignment .spaceBetween,
426- children: [
427- Text (positionText, style: textStyle),
428- Text (durationText, style: textStyle),
429- ],
430- ),
431- );
432- }
433- }
434-
435348class PlayerControlButtons extends StatelessWidget {
436349 const PlayerControlButtons ({
437350 super .key,
0 commit comments