import 'dart:typed_data'; import 'package:audioplayers/audioplayers.dart'; import 'package:flutter/material.dart'; import 'package:mymuseum_visitapp/app_context.dart'; import 'package:mymuseum_visitapp/constants.dart'; import 'package:provider/provider.dart'; class AudioPlayerContainer extends StatefulWidget { const AudioPlayerContainer({Key? key, required this.audioBytes, required this.isAuto}) : super(key: key); final Uint8List audioBytes; final bool isAuto; @override State createState() => _AudioPlayerContainerState(); } class _AudioPlayerContainerState extends State { AudioPlayer player = AudioPlayer(); late Uint8List audiobytes; bool isplaying = false; bool audioplayed = false; int currentpos = 0; int maxduration = 100; String currentpostlabel = "00:00"; @override void initState() { Future.delayed(Duration.zero, () async { audiobytes = widget.audioBytes; player.onDurationChanged.listen((Duration d) { //get the duration of audio maxduration = d.inSeconds; setState(() { }); }); player.onPositionChanged.listen((Duration p){ currentpos = p.inMilliseconds; //get the current position of playing audio //generating the duration label int shours = Duration(milliseconds:currentpos).inHours; int sminutes = Duration(milliseconds:currentpos).inMinutes; int sseconds = Duration(milliseconds:currentpos).inSeconds; int rminutes = sminutes - (shours * 60); int rseconds = sseconds - (sminutes * 60 + shours * 60 * 60); String minutesToShow = rminutes < 10 ? '0$rminutes': rminutes.toString(); String secondsToShow = rseconds < 10 ? '0$rseconds': rseconds.toString(); currentpostlabel = "$minutesToShow:$secondsToShow"; setState(() { //refresh the UI }); }); if(widget.isAuto) { player.play(BytesSource(audiobytes)); setState(() { isplaying = true; audioplayed = true; }); } }); super.initState(); } @override void dispose() { player.stop(); player.dispose(); super.dispose(); } @override Widget build(BuildContext context) { final appContext = Provider.of(context); return Container( child: Column( children: [ Container( child: Text(currentpostlabel, style: TextStyle(fontSize: 25),), ), Container( child: Wrap( spacing: 10, children: [ ElevatedButton.icon( style: ElevatedButton.styleFrom( primary: kMainColor, // Background color ), onPressed: () async { print(isplaying); print(audioplayed); if(!isplaying && !audioplayed){ player.play(BytesSource(audiobytes)); setState(() { isplaying = true; audioplayed = true; }); }else if(audioplayed && !isplaying){ player.resume(); setState(() { isplaying = true; audioplayed = true; }); }else{ player.pause(); setState(() { isplaying = false; }); } }, icon: Icon(isplaying?Icons.pause:Icons.play_arrow), label:Text(isplaying?"Pause":"Play") ), ElevatedButton.icon( style: ElevatedButton.styleFrom( primary: kMainColor, // Background color ), onPressed: () async { player.stop(); setState(() { isplaying = false; audioplayed = false; currentpostlabel = "00:00"; }); }, icon: Icon(Icons.stop), label:Text("Stop") ), ], ), ) ], ), ); } }