import 'dart:io';
import
'package:flutter/material.dart';
import 'package:flutter_audio_query/flutter_audio_query.dart';
import 'package:just_audio/just_audio.dart';
class MusicPlayer extends
StatefulWidget {
SongInfo songInfo;
Function changeTrack;
final GlobalKey<MusicPlayerState> key;
MusicPlayer{this.songInfo,this.changeTrack,this.key}):super(key: key);
MusicPlayerState
createState()=>MusicPlayerState();
}
class MusicPlayerState extends State<MusicPlayer> {
double minimumValue=0.0,
maximumValue=0.0,
currentValue=0.0;
String currentTime='',
endTime='';
bool isPlaying=false;
final AudioPlayer
player=AudioPlayer();
void initState() {
super.initState();
setSong(widget.songInfo);
}
void dispose() {
super.dispose();
player?.dispose();
}
void changeTrack(bool isNext) {
if(isNext) {
if(currentIndex!=songs.length-1) {
currentIndex++;
}
} else {
if(currentIndex!=0) {
currentIndex--;
}
}
key.currentState.setSong(songs[currentIndex]);
}
void setSong(SongInfo songInfo) async {
widget.songInfo=songInfo;
await player.setUrl(widget.songInfo.uri);
currentValue=minimumValue;
maximumValue=player.duration.inMilliseconds.toDouble();
setState(() {
currentTime=getDuration(currentValue);
endTime=getDuration(maximumValue);
});
isPlaying=false;
changeStatus();
player.positionStream.listen((duration) {
currentValue=duration.inMilliseconds.toDouble();
if(currentValue>=maximumValue) {
widget.changeTrack(true);.
}
setState(() {
currentTime=getDuration(currentValue);
});
});
}
void changeStatus() {
setState(() {
isPlaying=!isPlaying;
});
if(isPlaying) {
player.play();
} else {
player.pause();
}
}
String getDuration(double value) {
Duration duration=Duration(milliseconds: value.round());
return [duration.inMinutes, duration.inSeconds].map((element)=>element.remainder(60).toString().padLeft(2, '0')).join(':');
}
Slider(
inactiveColor:
Colors.black12,
activeColor:
Colors.black,
min: minimumValue,
max: maximumValue,
value: currentValue,
onChanged: (value) {
currentValue=value;
if(currentValue>=maximumValue) {
widget.changeTrack(true);
}
player.seek(Duration(milliseconds: currentValue.round()));
},),
当我将歌曲的滑块拖动到持续时间的末尾时,它会跳过一两首歌曲并带来错误,但如果我从 player.positionstream.listen 函数中删除 if (currentvalue >= maximum value) 它拖动时播放下一首曲目,但如果滑块在不拖动的情况下达到歌曲的最大持续时间,则返回错误行 166 pos 15: 'value >= min && value <= max': is not true。请问我需要你的帮助来解决这个错误