参考文章
自己的代码如下

import 'dart:async';
import 'package:audioplayer/audioplayer.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';//音乐播放器
typedef void OnError(Exception exception);const kUrl ="https://www.mediacollege.com/downloads/sound-effects/nature/forest/rainforest-ambient.mp3";
// const kUrl = "https://s3.amazonaws.com/scifri-segments/scifri201711241.mp3";enum PlayerState { stopped, playing, paused }class AudioPlay extends StatefulWidget {const AudioPlay({Key key}) : super(key: key);@override_AudioPlayState createState() => _AudioPlayState();
}class _AudioPlayState extends State<AudioPlay> {Duration duration;Duration position;AudioPlayer audioPlayer;String localFilePath;PlayerState playerState = PlayerState.stopped;bool prePlayState = false;List<String> _songs = ["https://www.mediacollege.com/downloads/sound-effects/nature/forest/rainforest-ambient.mp3","https://s3.amazonaws.com/scifri-segments/scifri201711241.mp3"];int curIndex = 0;get isPlaying => playerState == PlayerState.playing;get isPaused => playerState == PlayerState.paused;get durationText =>duration != null ? duration.toString().split('.').first : '';get positionText =>position != null ? position.toString().split('.').first : '';bool isMuted = false;StreamSubscription _positionSubscription;StreamSubscription _audioPlayerStateSubscription;@overridevoid initState() {super.initState();initAudioPlayer();}@overridevoid dispose() {_positionSubscription.cancel();_audioPlayerStateSubscription.cancel();audioPlayer.stop();super.dispose();}void initAudioPlayer() {audioPlayer = AudioPlayer();_positionSubscription = audioPlayer.onAudioPositionChanged.listen((p) => setState(() => position = p));_audioPlayerStateSubscription =audioPlayer.onPlayerStateChanged.listen((s) {if (s == AudioPlayerState.PLAYING) {setState(() => duration = audioPlayer.duration);} else if (s == AudioPlayerState.STOPPED) {onComplete();setState(() {position = duration;//0:00:09.643000和0:00:09.643000print("${duration}和${position}");//如果播放完就自动播放下一首,点击下一首按键也会调用到这个方法if (position == duration) {nextPlay();}//这个是专门给播放上一首按键调用的方法,因为调用了一次nextPlay(),这里就要调用两次prePlay()if (prePlayState) {prePlay();prePlay();prePlayState = false;}});}}, onError: (msg) {setState(() {playerState = PlayerState.stopped;duration = Duration(seconds: 0);position = Duration(seconds: 0);});});}// //播放// Future play() async {//   await audioPlayer.play(kUrl);//   setState(() {//     playerState = PlayerState.playing;//   });// }//播放Future play() async {await audioPlayer.play(_songs[curIndex]);setState(() {playerState = PlayerState.playing;});}// // 播放很多歌
//   void playSongs(List<String> songs, {int index}) {//     this._songs = songs;
//     if (index != null) curIndex = index;
//     play();
//   }//在播放时点击下一首是实现不了效果的,需要先停止再播放才能播放下一首//所以这个方法放在stop方法里面的下一首void nextPlay() {curIndex++;if (curIndex >= _songs.length) {curIndex = 0;}play();}//用于点击的下一首void nextPlayButton() {stop();}//放在stop方法的上一首void prePlay() {curIndex--;if (curIndex < 0) {curIndex = _songs.length - 1;}play();}//用于点击的上一首void prePlayButton() {prePlayState = true;stop();}Future _playLocal() async {await audioPlayer.play(localFilePath, isLocal: true);setState(() => playerState = PlayerState.playing);}//暂停Future pause() async {await audioPlayer.pause();setState(() => playerState = PlayerState.paused);}//停止Future stop() async {await audioPlayer.stop();setState(() {playerState = PlayerState.stopped;position = Duration();});}Future mute(bool muted) async {await audioPlayer.mute(muted);setState(() {isMuted = muted;});}void onComplete() {setState(() => playerState = PlayerState.stopped);}// Future _loadFile() async {//   final bytes = await _loadFileBytes(kUrl,//       onError: (Exception exception) =>//           print('_loadFile => exception $exception'));////   final dir = await getApplicationDocumentsDirectory();//   final file = File('${dir.path}/audio.mp3');////   await file.writeAsBytes(bytes);//   if (await file.exists())//     setState(() {//       localFilePath = file.path;//     });// }//这里的方法就是:可以先写一部分,然后再用Material(child: _buildPlayer()),显示其他界面,// 可以在_buildPlayer里面放其他方法体@overrideWidget build(BuildContext context) {final textTheme = Theme.of(context).textTheme;return Center(child: Center(child: Container(decoration: BoxDecoration(color: Color(0xFF1F1F1F)),//整个界面以列的形式排放child: Column(mainAxisAlignment: MainAxisAlignment.spaceEvenly,mainAxisSize: MainAxisSize.min,children: <Widget>[//封面,同时把按键放到底部Expanded(child: Column(children: [Container(// decoration: BoxDecoration(color: Colors.black),child: Text('',),),Container(margin: const EdgeInsets.only(left: 15, right: 15),child: Image.asset('assets/base_widgets/bg_player.png',fit: BoxFit.fitWidth,),),Container(child: Column(crossAxisAlignment: CrossAxisAlignment.start,children: [Container(margin: const EdgeInsets.only(left: 30, top: 30, bottom: 15),child: Text("Mojito",style: TextStyle(color: Color(0xFFCCCCCC), fontSize: 20)),),Row(children: [Container(margin:const EdgeInsets.only(left: 30, bottom: 12),child: Text("周杰倫",style: TextStyle(color: Color(0xFF999999)),),),Container(width: 30,margin:const EdgeInsets.only(left: 15, bottom: 12),child: Image.asset('assets/base_widgets/icon_player_vip.png',fit: BoxFit.fitWidth,),),Container(width: 30,margin:const EdgeInsets.only(left: 15, bottom: 12),child: Image.asset('assets/base_widgets/icon_player_standard.png',fit: BoxFit.fitWidth,),),],),Container(margin: const EdgeInsets.only(left: 30, bottom: 12),child: Text("麻烦给我的爱人来一杯Mojito",style: TextStyle(color: Color(0xFF666666))),),Container(margin: const EdgeInsets.only(left: 30, bottom: 12),child: Text("我喜欢阅读她微醺时的眼眸",style: TextStyle(color: Color(0xFFFFFFFF))),),Container(margin: const EdgeInsets.only(left: 30, bottom: 12),child: Text("而我的咖啡糖不用太多",style: TextStyle(color: Color(0xFF666666))),),],),),],),),//接着来到这里叫开始调用方法了Material(child: _buildPlayer()),if (!kIsWeb)localFilePath != null ? Text(localFilePath) : Container(),// if (!kIsWeb)//   Padding(//     padding: const EdgeInsets.all(8.0),// child: Row(//   mainAxisAlignment: MainAxisAlignment.spaceEvenly,//   children: [//     RaisedButton(//       // onPressed: () => _loadFile(),//       child: Text('Download'),//     ),//     if (localFilePath != null)//       RaisedButton(//         onPressed: () => _playLocal(),//         child: Text('play local'),//       ),//   ],// ),// ),],),),),);// return MaterialApp(//     home: Scaffold(//       body: Container(//         child: ListView(//           children: <Widget>[inputTextArea, loginButtonArea, loginSection],//         ),//       ),//     ));}Widget _buildPlayer() => Container(decoration: BoxDecoration(color: Color(0xFF1F1F1F)),padding: EdgeInsets.all(16.0),child: Column(mainAxisSize: MainAxisSize.min,children: [buttonMenuSection(),if (duration != null)//进度条Slider(value: position?.inMilliseconds?.toDouble() ?? 0.0,onChanged: (double value) {return audioPlayer.seek((value / 1000).roundToDouble());},min: 0.0,max: duration.inMilliseconds.toDouble()),//如果是空的就显示个空进度条if (duration == null)Slider(value: position?.inMilliseconds?.toDouble() ?? 0.0,),//进度条_buildProgressView(),Row(mainAxisSize: MainAxisSize.min,mainAxisAlignment: MainAxisAlignment.spaceBetween,children: [//循环Container(width: 40,margin: const EdgeInsets.only(left: 15, right: 15),child: Image.asset('assets/base_widgets/icon_player_cycle.png',fit: BoxFit.fitWidth,),),//上一首GestureDetector(onTap: () {prePlayButton();},child: Container(width: 40,margin: const EdgeInsets.only(left: 15, right: 15),child: Image.asset('assets/base_widgets/icon_player_previous.png',fit: BoxFit.fitWidth,),),),//播放GestureDetector(onTap: isPlaying ? () => pause() : () => play(),child: Container(width: 50,margin: const EdgeInsets.only(left: 15, right: 15),child: Image.asset('assets/base_widgets/icon_player_play.png',fit: BoxFit.fitWidth,),),),//下一首GestureDetector(onTap: () {nextPlayButton();},child: Container(width: 40,margin: const EdgeInsets.only(left: 15, right: 15),child: Image.asset('assets/base_widgets/icon_player_next.png',fit: BoxFit.fitWidth,),),),//均衡器Container(width: 40,margin: const EdgeInsets.only(left: 15, right: 15),child: Image.asset('assets/base_widgets/icon_player_tuning.png',fit: BoxFit.fitWidth,),),// IconButton(//   onPressed: isPlaying ? null : () => play(),//   iconSize: 64.0,//   icon: Icon(Icons.play_arrow),//   color: Colors.cyan,// ),// IconButton(//   onPressed: isPlaying ? () => pause() : null,//   iconSize: 64.0,//   icon: Icon(Icons.pause),//   color: Colors.cyan,// ),// IconButton(//   onPressed: isPlaying || isPaused ? () => stop() : null,//   iconSize: 64.0,//   icon: Icon(Icons.stop),//   color: Colors.cyan,// ),]),// if (position != null)//静音//   _buildMuteButtons(),// if (position != null)],),);Row _buildProgressView() =>Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [Container(margin: const EdgeInsets.only(left: 15),child: Text(position != null? "${positionText ?? ''} ": duration != null? durationText: '',style: TextStyle(fontSize: 12.0, color: Colors.white),),),Container(margin: const EdgeInsets.only(left: 15),child: Text(position != null? "${durationText ?? ''}": duration != null? durationText: '',style: TextStyle(fontSize: 12.0, color: Colors.white),)),// Padding(//   padding: EdgeInsets.all(12.0),//圆形进度条// child: CircularProgressIndicator(//   value: position != null && position.inMilliseconds > 0//       ? (position?.inMilliseconds?.toDouble() ?? 0.0) ///       (duration?.inMilliseconds?.toDouble() ?? 0.0)//       : 0.0,//   valueColor: AlwaysStoppedAnimation(Colors.cyan),//   backgroundColor: Colors.grey.shade400,// ),// ),// Text(//   position != null//       ? "${positionText ?? ''} / ${durationText ?? ''}"//       : duration != null//           ? durationText//           : '',//   style: TextStyle(fontSize: 24.0, color: Colors.white),// )]);//是否静音Row _buildMuteButtons() {return Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: <Widget>[if (!isMuted)FlatButton.icon(onPressed: () => mute(true),icon: Icon(Icons.headset_off,color: Colors.cyan,),label: Text('Mute', style: TextStyle(color: Colors.cyan)),),if (isMuted)FlatButton.icon(onPressed: () => mute(false),icon: Icon(Icons.headset, color: Colors.cyan),label: Text('Unmute', style: TextStyle(color: Colors.cyan)),),],);}//上面图片下面文字的那一排按键的方法Column menuButtonColumn(String icon, String label) {//嵌套函数:把共同的属性写好,方便buttonSection调用//设置为主题颜色Color color = const Color(0xFF999999);//返回列的形式return Column(//调用该方法后返回这个显示,每个元素以列的方式显示mainAxisSize: MainAxisSize.min,mainAxisAlignment: MainAxisAlignment.center,//有两个元素children: [Image.asset(icon,height: 45.0,fit: BoxFit.cover,),Container(//将文字设置为容器,设置边距margin: const EdgeInsets.only(top: 8.0), //文字距离上面图标的距离child: Text(//元素就是一个文字label,style: TextStyle(//设置文字风格fontSize: 12.0,fontWeight: FontWeight.w400,color: color,),),)],);}//底部那一排五个按键Row buttonMenuSection() {//先从行上开始进行分析return Row(//平均的分配每个列占据的行空间mainAxisAlignment: MainAxisAlignment.spaceBetween,//行上的四个元素//调用方法,不然要写很多children: [menuButtonColumn("assets/base_widgets/icon_player_cover.png", '翻唱'),menuButtonColumn("assets/base_widgets/icon_player_equalizer.png", '均衡器'),menuButtonColumn("assets/base_widgets/icon_player_member_download.png", '下載'),menuButtonColumn("assets/base_widgets/icon_player_comment.png", '評論'),menuButtonColumn("assets/base_widgets/icon_player_more.png", '更多'),],);}
}

flutter播放上一首和下一首,自动播放下一首相关推荐

  1. php怎么让视频自动播放,怎样让优酷等视频实现自动播放

    优酷播放器自动播放方法: 方法一:1.把下面的代码复制到记事本中,保存备用. http://player.youku.com/player.php/sid/XMzg4NzEyOTY==/v.swf?V ...

  2. 服务器在线看视频无法播放,上传到服务器的视频不能在线播放怎么办?

    原标题:上传到服务器的视频不能在线播放怎么办? 问题:我们在本地测试视频播放时,常常遇到这种情况,本地测试视频是可以正常播放的,但项目上传服务器后,视频就无法播放了,原因通常有以下几种,原因及解决方案 ...

  3. chrome下音频无法自动播放的解决办法

    众所周知,chrome浏览器在18年4月起,就在桌面浏览器全面禁止了音视频的自动播放功能.不光是这样,在页面加载完毕的情况下,用户没有click.dbclick.touch等主动交互行为,使用js直接 ...

  4. html背景音乐自动播放embed,怎样在网页中插入背景音乐(自动播放代码).doc

    怎样在网页中插入背景音乐 软件 Dreamweaver带浏览器的电脑 1 首先在网上下载一个Dreamweaver软件安装,当然使用其他的网站编程软件也可以. 2 打开软件界面如下. 3 选择&quo ...

  5. html打开ppt自动播放,ppt文件怎么打开就可以全屏自动播放

    我们制作PPT是为了演示我们的幻灯片文稿,ppt文件打开后还需要去点击powerpoint菜单中的"幻灯片放映"才能播放,这很多时候有种麻烦的感觉,能否直接自动播放PPT呢?ppt ...

  6. HTML 关闭优酷自动播放,Disable HTML5 Autoplay插件,禁止页面自动播放视频和音频

    Disable HTML5 Autoplay插件的功能简单且实用,安装插件后即可在网页上禁用HTML5音频和视频自动播放. 多年以来,许多网站都使用的Adobe Flash等软件来展示视频,而许多浏览 ...

  7. html 下拉菜单自动填充,下拉框自动实现自动填充

    在我们平台中有这样的一个功能,设置了数据字典就可以使下拉框自动选择数据的类型,但是有一点不足的地方就是没有默认值,现在我要做的就是如何实现这个有默认值的下拉框. 还是有日期来举例.如图所示功能: (1 ...

  8. 如何阻止YouTube在iOS,Android和Web上自动播放视频

    Over at YouTube, they love it when you watch more YouTube. If you're sick of YouTube automatically q ...

  9. html音视频app制作,怎么实现HTML5页面音视频在微信和app下自动播放

    怎么实现HTML5页面音视频在微信和app下自动播放 发布时间:2020-09-28 15:52:53 来源:亿速云 阅读:90 作者:小新 这篇文章给大家分享的是有关怎么实现HTML5页面音视频在微 ...

  10. vue中使用TcPlayer,自动播放视频,以及下一个视频

    前提是已经知道如何使用腾讯的TcPlayer. 腾讯云点播 超级播放器开发:https://cloud.tencent.com/document/product/266/14603 一.自动播放视频. ...

最新文章

  1. 十四、深入Python条件和循坏
  2. PyTorch深度学习实践07
  3. spring mvc学习(53):回顾和springmvc返回值类型总结
  4. Linux—Centos 7.x安装Tomcat8
  5. 04-10 swagger 接口管理体系
  6. Linux关闭密码登录
  7. php怎么求阶乘_php递归函数求阶乘
  8. Ember.js 入门指南 (一)
  9. [生成模型新方向]: score-based generative models
  10. 在微信中怎么打开微信运动?福利干货!如何在微信中开启微信运动记录每天运动步数?
  11. Echoing an XML File with the SAX Parser
  12. ThinkPad E450 uefi模式下移动硬盘安装Ubuntu14.04(本机硬盘是win10)
  13. Java 消息队列、缓存、同步(个人理解:空谈)
  14. 高分辨率屏幕下vm安装xp的解决方案
  15. win10 python3.5.2下安装facenet
  16. Linux命令行下修改文件或文件夹名
  17. android 微信分享注册链接显示app的logo出现黑边处理方案
  18. ECharts 源码解读 二
  19. mysql事务转账_模拟数据库事务实现转账
  20. 微型计算机点火系统的摘要,丰田汽车点火系统故障诊断与排除的毕业论文教案.doc...

热门文章

  1. Unity手柄按键映射
  2. eb8000软件怎样上传_EB8000程序上传与下载
  3. 关于未来几年家庭信息通讯的几点遥想
  4. Oracle 分页查询 rownum 和 offset
  5. Android视频播放器架构接口的设计
  6. 经纬度坐标转化为XYZ坐标的理解
  7. win7打印机共享出现0x000006d9错误的解决方法
  8. 查看不到网络上的计算机和设备,Win10 无法看到局域网中的其他计算机及网络打印机...
  9. JS实现网页自动跳转
  10. Linux内核-进程管理