在Flutter中播放音频文件

4

嘿,我想为我的应用程序添加背景音乐,因此我需要知道如何在Flutter中播放音频文件。我已经导入了许多音频包,但没有一个真正起作用,我是Flutter的新手,如果可能的话,它应该是一个简短的命令,并且我需要它用于Android应用程序。希望有人能帮助我,感谢您的帮助。

几乎起作用

1个回答

4

我曾经处于和你一样的情况,音频很难(所以要做好准备)。 在经历了四天的努力之后,我成功让我的背景音乐正常工作了(非常抱歉回答这么长,但那就是必须的)。希望你的不需要那么长时间:

首先,你需要将音频播放器添加到应用程序中:

import 'package:audioplayers/audio_cache.dart';
import 'package:audioplayers/audioplayers.dart';

在播放音频的页面中导入这些内容(我建议从主页(main.dart)播放背景音乐):

然后在 Class state 下,需要如下制作 audio-playeraudio-cache

class _YourMainPageNameState extends State<YourMainPageName> {

AudioPlayer player = AudioPlayer();  //add this
  AudioCache cache = new AudioCache();  //and this

@override
  Widget build [...]

每当您想播放音频时,请调用该方法:

player = await cache.loop('assets/yourMusicFileHere');

停止它的调用:

player.stop();

如果您希望应用程序打开时音乐从指定点开始播放,请使用 WillPopScope 包装 Scaffold,方法如下:
Future<bool> _willPopCallback() async {
    player = await cache.loop('assets/yourMusicFileHere');
    return true;
  }

override
  Widget build(BuildContext context) {
return WillPopScope(onWillPop: _willPopCallback, child: new Scaffold( [...] )
}

欢迎向我发送任何错误,我每天都会在 stackOverFlow 上多次出现,所以我会回答你的问题。



编辑: 我刚才意识到我犯了一个错误,我说WillPopScope可以用来启动应用程序时播放音乐,这是不正确的,WillPopScope是用于当您离开页面时。因此,它可以用于在用户离开应用程序时停止播放音乐。

现在要让音乐在应用程序打开时开始播放,我们必须像这样在构建小部件树时调用一个函数:

Future<bool> _willPopCallback() async { 
    player.stop(); //change this
    return true;
  }

openingActions() async { //add this
    player = await cache.loop('assets/yourMusicFileHere.mp3'); //add this
  } //add this

  @override
  Widget build(BuildContext context) {
    openingActions();
    return WillPopScope(onWillPop: _willPopCallback, child: new Scaffold( [...] )

您可能会遇到音乐被播放两次的问题,此时需要在播放音乐时添加安全检查,代码如下:
 bool isPlaying = false;

 Future<bool> _willPopCallback() async { //change this whole thing
    if(isPlaying == false) {
      setState(() { 
        isPlaying = true;
      });
      player.stop();
    }
   return true;
  }
  • 感谢 - Tobias

1
兄弟,你完全进入了比尔·盖茨模式,你帮了我很多,但我仍然有一个问题。我在我的帖子中放了2个截图,如果我在按钮中使用_willPopCallback(),它可以工作,但如果我像你说的那样使用"return WillPopScope(onWillPop: _willPopCallback,",它就不起作用了。我认为原因是它必须是_willPopCallback(),但如果我这样做,我会得到错误"The argument type 'Future<bool>' can't be assigned to the parameter type 'Future<bool> Function()'."也许你可以用你的比尔·盖茨大脑来修复它,我爱你 xD - need_help_1234
我刚刚编辑了我的第一个答案。我意识到我说WillPopScope应该立即播放音乐,而实际上它是用于在用户离开应用程序时暂停音乐的。至于你在willPopCallback中遇到的问题,我不确定(我无法得到相同的错误)。但是请尝试查看此链接https://stackoverflow.com/questions/58100060/onwillpop-futureboolfunctionbuildcontext-can-not-be-assigned-to-parameter,我不确定是否是同样的问题,但可能会有所帮助。否则,请尝试常规的错误排除方法:在终端中运行Flutter clean并重新打开项目。如有需要,请随时与我联系。 - Tobias H.
好的,现在我的应用程序可以正常工作了,但是每次我按下一个按钮时背景音乐就会重新开始播放。我已经发布了我的最新代码截图,我认为willpopcallback方法可能不正确,或者我做错了什么。 - need_help_1234
尝试将“isPlaying”默认设置为true,或在应用程序打开时播放背景音乐时在“openingActions”中将其设置为true。这是因为音乐开始播放,但“isPlaying”没有开始,然后“下一个”背景音乐开始播放,因为“isPlaying”没有打开。另外,我很好奇这个按钮是做什么的?(如果它是关闭背景音乐的按钮,我可以帮你解决) - Tobias H.
1
我为这个问题开始了一个新的提问,如果你有解决方案,可以在评论中分享。你帮了我很多,所以谢谢你。 - need_help_1234

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接