如何停止在 Flutter 中播放音频

时间:2021-06-07 17:07:52

标签: flutter dart

我正在使用 audioplayers: ^0.18.0 在屏幕出现时播放音频。

这是在initstate中调用的播放音频的代码:

void initState() {
    startTimer();
    playLocalAsset();
    super.initState();
  }

这是调用播放函数:

AudioPlayer player;
  Future<AudioPlayer> playLocalAsset() async {
    AudioCache cache = new AudioCache();
    //At the next line, DO NOT pass the entire reference such as assets/yes.mp3. This will not work.
    //Just pass the file name only.
    return await cache.play("audio.wav");
  }

我想在 onPressed() 中停止它:

    onPressed: () {
// this is where stop audio should be used
                            
                            Navigator.push(
                              context,
                              MaterialPageRoute(
                                builder: (context) {
                                  return Homepage(
                                    device: widget.device,
                                  );
                                },
                              ),
                            );
                          },

当我按下我在 Flutter 应用程序中制作的取消按钮时,如何停止音频声音。我不能称之为 Future 来阻止它,请帮助我。

2 个答案:

答案 0 :(得分:0)

娜比亚萨尔曼

我 1 年前制作了一个音频播放器。我真的不知道我在做什么。我只是想做点什么。

我在这里复制了我的代码。希望能帮到你。

您可以自由使用此代码。这段代码是在 Flutter 2.2 之前写的,所以可能会因为 null 安全而出现一些错误。

class _SongsPage extends State<SongsPage> {
  List<String> pictures = <String>["assets/images/thespectre.jpg", "assets/images/home.jpg", "assets/images/alone.jpg", "assets/images/lostf.jpg", "assets/images/breakingme.png", "assets/images/cry.jpg", "assets/images/onelife.jpg", "assets/images/coming.jpg", "assets/images/allnight.jpg", "assets/images/wildest.jpg", "assets/images/lovers.jpg", "assets/images/nothing.jpg"];
  List<String> songname = <String>["The Spectre", "Home", "Alone", "Don't Leave Me Now", "Breaking Me", "Cry", "One Life", "Coming Home", "All Night", "Wildest Dream", "Lovers For The Weekend", "Nothing Stopping Me"];
  List<String> performer = <String>["Alan Walker", "Martin Garrix", "Marshmello", "Lost Frequencies", "Topic", "Gryffin", "Mike Perry", "Dimitri Vangelis & Wyman", "Afrojack", "Thomas Gold", "John De Sohn", "Vicetone"];
  List<String> song = <String>['TheSpectre.mp3', 'Home.mp3', 'Alone.mp3', 'DontLeaveMeNow.mp3', 'BreakingMe.mp3', 'Cry.mp3', 'OneLife.mp3', 'ComingHome.mp3', 'AllNight.mp3', 'WildestDream.mp3', 'LoversForTheWeekend.mp3', 'NothingStoppingMe.mp3'];
  bool isPlaying = false;
  bool isLiked = false;
  int index = 0;
  Duration _duration = new Duration();
  Duration _position = new Duration();
  AudioPlayer advancedPlayer;
  AudioCache audioCache;

  _SongsPage(int indexer){
    index = indexer;
  }

  @override
  void initState() {
    super.initState();
    initPlayer();
  }

  void initPlayer() {
    advancedPlayer = new AudioPlayer();
    audioCache = new AudioCache(fixedPlayer: advancedPlayer);

    advancedPlayer.durationHandler = (d) => setState(() {
      _duration = d;
    });

    advancedPlayer.positionHandler = (p) => setState(() {
      _position = p;
    });
  }

  String localFilePath;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        decoration: BoxDecoration(
          gradient: LinearGradient(
            begin: Alignment.topLeft,
            end: Alignment.bottomRight,
            colors: [kbackgroundcolorpink, kbackgroundcolorblue],
            tileMode: TileMode.repeated,
          ),
        ),
        child: Column(
          children: <Widget>[
            Expanded(
              flex: 10,
              child: Column(
                children: <Widget>[
                  //Picture
                  Container(
                    margin: EdgeInsets.only(top: 120),
                    width: 200,
                    height: 200,
                    decoration: BoxDecoration(
                      boxShadow: [
                        BoxShadow(
                          color: kblack.withOpacity(0.4),
                          spreadRadius: 3,
                          blurRadius: 4,
                          offset: Offset(3, 2),
                        ),
                      ],
                    ),
                    child: Image.asset(pictures[index]),
                  ),
                  //Song and Performer
                  Container(
                    margin: EdgeInsets.only(top: 20),
                    height: 80,
                    child: Column(
                      children: <Widget>[
                        Text(songname[index], style: kheadlinesong),
                        Text(performer[index], style: kheadlineperformer),
                      ],
                    ),
                  ),
                  //Timer
                  Container(
                    padding: EdgeInsets.only(right: 36),
                    child: Align(
                      alignment: Alignment.centerRight,
                      child: Text((_position.inMinutes).toString() + ":" + (_position.inSeconds - (_position.inMinutes * 60)).toString().padLeft(2, "0") + " / " + (_duration.inMinutes).toString() + ":" + (_duration.inSeconds - (_duration.inMinutes * 60)).toString().padLeft(2, "0"), textAlign: TextAlign.right, style: kheadlineperformer),
                    ),
                  ),
                  //Line
                  Container(
                    padding: EdgeInsets.only(right: 12, left: 12),
                    child: Slider(
                        activeColor: kbackgroundcolorpink,
                        inactiveColor: kbackgroundcolorblue,
                        value: _position.inSeconds.toDouble(),
                        min: 0.0,
                        max: _duration.inSeconds.toDouble(),
                        onChanged: (double value) {
                          setState(() {
                            seekToSecond(value.toInt());
                            value = value;
                          });
                        }),
                  ),
                ],
              ),
            ),
            Expanded(
              flex: 3,
              child: Container(
                child: Column(
                  children: <Widget>[
                    Container(
                      padding: EdgeInsets.only(bottom: 15),
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.center,
                        crossAxisAlignment: CrossAxisAlignment.center,
                        children: <Widget>[
                          Spacer(),
                          Spacer(),
                          IconButton(
                            icon: PreviousIcon,
                            onPressed: () {PreviousIconClick();},
                          ),
                          Spacer(),
                          IconButton(
                            icon: Icon(isPlaying ? PauseIcon : PlayIcon2, color: kwhite, size: 40),
                            onPressed: () {PausePlayIconClick();},
                          ),
                          Spacer(),
                          IconButton(
                            icon: NextIcon,
                            onPressed: () {NextIconClick();},
                          ),
                          Spacer(),
                          Spacer(),
                        ],
                      ),
                    ),
                    Container(
                      padding: EdgeInsets.only(top: 15),
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.center,
                        crossAxisAlignment: CrossAxisAlignment.center,
                        children: <Widget>[
                          Spacer(),
                          IconButton(
                            icon: Icon(isLiked ? LikeIcon2 : LikeIcon, color: kwhite, size: 26),
                            onPressed: () {LikeIconClick();},
                          ),
                          Spacer(),
                          IconButton(
                            icon: ShareIcon,
                            onPressed: () {ShareIconClick();},
                          ),
                          Spacer(),
                          IconButton(
                            icon: Icon(ReplayIcon, color: isPlaying ? kbackgroundcolorpink : kwhite, size: 26),
                            onPressed: () {ReplayIconClick();},
                          ),
                          Spacer(),
                          IconButton(
                            icon: AddToListIcon,
                            onPressed: () {AddIconClick();},
                          ),
                          Spacer(),
                        ],
                      ),
                    ),
                  ],
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }

  void seekToSecond(int second) {
    Duration newDuration = Duration(seconds: second);
    advancedPlayer.seek(newDuration);
  }

  void PreviousIconClick(){
    if(index == 0){
      index = index;
      Playing();
    }
    else {
      index--;
      Playing();
    }
  }

  void NextIconClick(){
    if (index == song.length - 1){
      index = 0;
      Playing();
    }
    else{
      index++;
      Playing();
    }
  }

  void LikeIconClick(){
    if(isLiked){
      setState(() {
        isLiked = false;
      });
    }
    else{
      setState(() {
        isLiked = true;
      });
    }
  }

  void ReplayIconClick(){

  }

  void AddIconClick(){

  }

  void ShareIconClick(){

  }

  void Playing(){
    audioCache.play(song[index]);

    setState(() {
      isPlaying = true;
    });
  }

  void PausePlayIconClick(){
    if(isPlaying){
      advancedPlayer.pause();

      setState(() {
        isPlaying = false;
      });
    }
    else{
      audioCache.play(song[index]);

      setState(() {
        isPlaying = true;
      });
    }
  }
}

这看起来像这样,并且工作正常。

enter image description here

答案 1 :(得分:-1)

playstop 初始化函数

AudioPlayer player = new AudioPlayer();
  AudioCache audioCache;
  String mp3Uri = "audio.wav";

  void _playSound() {
    audioCache = new AudioCache(fixedPlayer: player);
    audioCache.play("audio.wav");
  }
  void _stopSound() {
    player.stop();
  }

现在在 initState 和 onPressed 内部调用 _playSound 函数调用 _stopSound 函数