I am trying to build an audio player in Flutter. I am using audioplayers
package.
I have an audio player class with the following code:
import 'package:audioplayers/audioplayers.dart';
import 'package:flutter/material.dart';
class MyAudio extends ChangeNotifier{
Duration totalDuration;
Duration position;
String audioState;
final String url;
MyAudio(this.url){
initAudio();
}
AudioPlayer audioPlayer = AudioPlayer();
initAudio(){
audioPlayer.onDurationChanged.listen((updatedDuration) {
totalDuration = updatedDuration;
notifyListeners();
});
audioPlayer.onAudioPositionChanged.listen((updatedPosition) {
position = updatedPosition;
notifyListeners();
});
audioPlayer.onPlayerStateChanged.listen((playerState) {
if(playerState == AudioPlayerState.STOPPED)
audioState = "Stopped";
if(playerState==AudioPlayerState.PLAYING)
audioState = "Playing";
if(playerState == AudioPlayerState.PAUSED)
audioState = "Paused";
notifyListeners();
});
}
playAudio(){
audioPlayer.play(url);
}
pauseAudio(){
audioPlayer.pause();
}
stopAudio(){
audioPlayer.stop();
}
seekAudio(Duration durationToSeek){
audioPlayer.seek(durationToSeek);
}
}
As you can see, there is a parameter named url, I want to pass that variable whenever a song is picked from a playlist. However, I am using this player with a Consumer
like:
Consumer<MyAudio>(
builder:(_,myAudioModel,child) => Slider(...)
In this case, I am not able to pass URL
parameter, How should I use Consumer so that I can pass URL
parameter explicitly?
The MyAudio
Notifier is inyected as a single dependency in the application. If you want change the current url, pass as parameter in play
method and invoke:
class MyAudio extends ChangeNotifier{
Duration totalDuration;
Duration position;
String audioState;
MyAudio(){
initAudio();
}
AudioPlayer audioPlayer = AudioPlayer();
initAudio(){
audioPlayer.onDurationChanged.listen((updatedDuration) {
totalDuration = updatedDuration;
notifyListeners();
});
audioPlayer.onAudioPositionChanged.listen((updatedPosition) {
position = updatedPosition;
notifyListeners();
});
audioPlayer.onPlayerStateChanged.listen((playerState) {
if(playerState == AudioPlayerState.STOPPED)
audioState = "Stopped";
if(playerState==AudioPlayerState.PLAYING)
audioState = "Playing";
if(playerState == AudioPlayerState.PAUSED)
audioState = "Paused";
notifyListeners();
});
}
playAudio(String url){
audioPlayer.play(url);
}
pauseAudio(){
audioPlayer.pause();
}
stopAudio(){
audioPlayer.stop();
}
seekAudio(Duration durationToSeek){
audioPlayer.seek(durationToSeek);
}
}
In Consumer:
Consumer<MyAudio>(
builder:(_,myAudioModel,child) {
myAudioModel.play("MyUrl");
return MyWidget();
}),
Or if you have a callback that handle the play action:
```dart
Consumer<MyAudio>(
builder:(_,myAudioModel,child) {
return MyWidget(
onPressed: () => myAudioModel.play("MyUrl"),
// ...
);
}),