Flutter 移动到另一个字母时停止字母的声音

Flutter Stop the letter sound when moving to another letter

提问人:faisal 提问时间:8/31/2023 最后编辑:faisal 更新时间:9/8/2023 访问量:88

问:

如果用户没有等待听到 字母的声音 他快速地在按钮之间移动 声音之间有重叠, 所有的声音都仍然存在. 在应用程序的后台 如何纠正或解决问题?完整代码

https://github.com/Saleque474/Learn-Alphabet

在此处输入图像描述

dependencies : kplayer: ^0.2.4


class _HomeState extends State<Home> {
  String currentAlphabet = "A";
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.amber[200],
      body: LayoutBuilder(builder: (context, constraints) {
        var height = constraints.maxHeight;
        var width = constraints.maxWidth;
        return Column(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: [
            sentenceHolder(height, width),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: [
                imageHolder(height, width),
                wordHolder(height, width),
              ],
            ),
            Container(
              decoration:
                  BoxDecoration(borderRadius: BorderRadius.circular(15)),
              child: Wrap(
                children: changePos(),
              ),
            ),
          ],
        );
      }),
    );
  }

  playAudio(String path) {
    Player.asset(path).play();
  }

  List<Widget> changePos() {
    List<Widget> children = [
      ...alphabets
          .map(
            (e) => textHolder(e),
          )
          .toList()
    ];

    return children;
  }

Widget textHolder(String alphabet) {
    return Padding(
      padding: const EdgeInsets.all(7),
      child: ElevatedButton(
        onPressed: () {
          currentAlphabet = alphabet;
          playAudio("assets/audio/$alphabet.wav");
          setState(() {});
        },
        child: Text(alphabet),
      ),
    );
  }

// 当调用字母时,声音是一个函数

它正常工作,但是如果我们在字母按钮之间快速移动,我们会注意到所有声音同时协同工作 //

颤振 音频 重叠

评论


答:

0赞 Jatinder Verma 8/31/2023 #1

一个简单的解决方案是: 在调用 play() 之前停止已经播放的歌曲/声音

评论

0赞 faisal 9/1/2023
试过了,但没有用
0赞 Khaled Sayed 9/3/2023 #2

您可以通过以下 3 个步骤处理这种情况:

1- 从玩家类创建一个公共对象(可为空) 确保在方法 playAudio 之外声明它; 选手?公共播放器;

2- 在播放声音之前,请确保停止旧声音

if(publicPlayer != null) publicPlayer.stop();

3- 而不是调用 Player.asset(path).play(); 分配 publicPlayer 后调用;

publicPlayer = Player.asset(路径); publicPlayer.play();

评论

0赞 Khaled Sayed 9/4/2023
你调用方法没有 () .stop();不是 .stop;
0赞 faisal 9/4/2023
目前我使用此解决方案 drive.google.com/file/d/1YJ-dXxtpLVWuY1M2kpzriHwhQbCHUDt1/,但目前不起作用......
0赞 faisal 9/8/2023 #3
class _HomeState extends State<Home> {
  AudioPlayer _audioPlayer;
  @override
  void initState() {
    _audioPlayer = AudioPlayer();
    // TODO: implement initState
    super.initState();
  }

  @override
  void dispose() {
    // _audioPlayer.dispose();
    super.dispose();
  }

  void _playAudio(String assetPath) async {
    _audioPlayer.pause();
    assetPath = ("assets/audio/$currentAlphabet.mp3");
    try {
      await _audioPlayer.setAsset(assetPath);
      _audioPlayer.play();
    } catch (e) {
      debugPrint("Error loading audio source: $e");
    }
  }}

我使用just_audio解决了这个问题:

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述