import 'package:flutter/material.dart'; class MediaIndicatorBuilder extends StatelessWidget { final bool isVolumeIndicator; final ValueNotifier value; const MediaIndicatorBuilder({super.key, required this.value, required this.isVolumeIndicator}); @override Widget build(BuildContext context) { return ValueListenableBuilder( valueListenable: value, builder: (context, value, child) => Padding( padding: const EdgeInsets.symmetric(horizontal: 40), child: Row( mainAxisAlignment: isVolumeIndicator ? MainAxisAlignment.start : MainAxisAlignment.end, children: [ Container( clipBehavior: Clip.antiAlias, decoration: BoxDecoration( color: Colors.black54, borderRadius: BorderRadius.circular(100), ), width: 30, child: UnconstrainedBox( child: Padding( padding: const EdgeInsets.symmetric(vertical: 10), child: Column( children: [ Text( (value * 100).ceil().toString(), style: const TextStyle(color: Colors.white), ), Padding( padding: const EdgeInsets.all(5), child: RotatedBox( quarterTurns: -1, child: Container( clipBehavior: Clip.antiAlias, decoration: BoxDecoration( color: Colors.transparent, borderRadius: BorderRadius.circular(100), ), child: SizedBox.fromSize( size: const Size(130, 20), child: LinearProgressIndicator(value: value, backgroundColor: Colors.transparent)), ), ), ), Icon( isVolumeIndicator ? switch (value) { == 0.0 => Icons.volume_off, < 0.5 => Icons.volume_down, _ => Icons.volume_up, } : switch (value) { < 1.0 / 3.0 => Icons.brightness_low, < 2.0 / 3.0 => Icons.brightness_medium, _ => Icons.brightness_high, }, color: Colors.white, ) ], ), ), ), ), ], ), )); } }