Line data Source code
1 : import 'dart:async';
2 :
3 : import 'package:audioplayers/audioplayers.dart';
4 : import 'package:flutter/material.dart';
5 :
6 : class PlayAudioButton extends StatefulWidget {
7 0 : const PlayAudioButton({super.key, required this.audioPath});
8 :
9 : final String audioPath;
10 :
11 0 : @override
12 0 : State<PlayAudioButton> createState() => _PlayAudioButtonState();
13 : }
14 :
15 : class _PlayAudioButtonState extends State<PlayAudioButton> {
16 : PlayerState? _playerState;
17 : StreamSubscription? _playerCompleteSubscription;
18 : StreamSubscription? _playerStateChangeSubscription;
19 :
20 0 : bool get _isPlaying => _playerState == PlayerState.playing;
21 :
22 : late AudioPlayer player = AudioPlayer();
23 :
24 0 : @override
25 : void initState() {
26 0 : super.initState();
27 : // Create the audio player.
28 0 : player = AudioPlayer();
29 :
30 : // Set the release mode to keep the source after playback has completed.
31 0 : player.setReleaseMode(ReleaseMode.stop);
32 :
33 : // Start the player as soon as the app is displayed.
34 0 : WidgetsBinding.instance.addPostFrameCallback((_) async {
35 0 : await player.setSource(AssetSource(widget.audioPath));
36 : });
37 0 : _playerState = player.state;
38 0 : _playerCompleteSubscription = player.onPlayerComplete.listen((event) {
39 0 : setState(() {
40 0 : _playerState = PlayerState.stopped;
41 : });
42 : });
43 0 : _playerStateChangeSubscription =
44 0 : player.onPlayerStateChanged.listen((state) {
45 0 : setState(() {
46 0 : _playerState = state;
47 : });
48 : });
49 : }
50 :
51 0 : @override
52 : void dispose() {
53 : // Release all sources and dispose the player.
54 0 : player.dispose();
55 0 : _playerCompleteSubscription?.cancel();
56 0 : _playerStateChangeSubscription?.cancel();
57 :
58 0 : super.dispose();
59 : }
60 :
61 0 : @override
62 : Widget build(BuildContext context) {
63 0 : WidgetsBinding.instance.addPostFrameCallback((_) async {
64 0 : await player.setSource(AssetSource(widget.audioPath));
65 : });
66 :
67 0 : return IconButton(
68 0 : icon: Icon(
69 0 : (_isPlaying)
70 : ? Icons.pause_circle_outline_rounded
71 : : Icons.play_circle_outline_rounded,
72 : size: 100,
73 0 : color: Theme.of(context).colorScheme.primary,
74 : ),
75 : splashColor: Colors.transparent,
76 : highlightColor: Colors.transparent,
77 0 : onPressed: () {
78 0 : playSound();
79 : },
80 : );
81 : }
82 :
83 0 : Future<void> playSound() async {
84 0 : if (_isPlaying) {
85 0 : await player.stop();
86 0 : setState(() => _playerState = PlayerState.stopped);
87 : } else {
88 0 : await player.resume();
89 0 : setState(() => _playerState = PlayerState.playing);
90 : }
91 : }
92 : }
|