LCOV - code coverage report
Current view: top level - lib/exercises/categories/dictation/note_finder - dictation_audio_play.dart Coverage Total Hit
Test: lcov.info Lines: 0.0 % 38 0
Test Date: 2025-05-10 20:26:13 Functions: - 0 0

            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              : }
        

Generated by: LCOV version 2.3-1