Search code examples
flutteraudioprovider

Flutter: Pass parameters to Consumed class by Consumer


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?


Solution

  • 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"),
          // ...
        );
      }),