jeromexiong / audio_manager

A flutter plugin for music playback, including notification handling.
MIT License
100 stars 53 forks source link

How can I rebuild only single widgets of my app #25

Closed md186 closed 4 years ago

md186 commented 4 years ago

Hey there Hope you can help me out. I’m using the following code in my main.dart file:

String _platformVersion = 'Unknown'; bool isPlaying = false; Duration _duration; Duration _position; double _slider; double _sliderVolume; String _error; num curIndex = 0; PlayMode playMode = AudioManager.instance.playMode;

final list = [ { "title": "Assets", "desc": "local assets playback", "url": "assets/audio.mp3", "coverUrl": "assets/ic_launcher.png" }, { "title": "network", "desc": "network resouce playback", "url": "https://dl.espressif.com/dl/audio/ff-16b-2c-44100hz.m4a", "coverUrl": "https://homepages.cae.wisc.edu/~ece533/images/airplane.png" } ];

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

initPlatformState();
setupAudio();
// loadFile();

}

@override void dispose() { // 释放所有资源 AudioManager.instance.stop(); super.dispose(); }

void setupAudio() { List _list = []; list.forEach((item) => _list.add(AudioInfo(item["url"], title: item["title"], desc: item["desc"], coverUrl: item["coverUrl"])));

AudioManager.instance.audioList = _list;
AudioManager.instance.intercepter = true;
AudioManager.instance.play(auto: false);

AudioManager.instance.onEvents((events, args) {
  print("$events, $args");
  switch (events) {
    case AudioManagerEvents.start:
      print("start load data callback");
      _position = AudioManager.instance.position;
      _duration = AudioManager.instance.duration;
      _slider = 0;
      setState(() {});
      break;
    case AudioManagerEvents.ready:
      print("ready to play");
      _error = null;
      _sliderVolume = AudioManager.instance.volume;
      _position = AudioManager.instance.position;
      _duration = AudioManager.instance.duration;
      setState(() {});
      // if you need to seek times, must after AudioManagerEvents.ready event invoked
      // AudioManager.instance.seekTo(Duration(seconds: 10));
      break;
    case AudioManagerEvents.seekComplete:
      _position = AudioManager.instance.position;
      _slider = _position.inMilliseconds / _duration.inMilliseconds;
      setState(() {});
      print("seek event is completed. position is [$args]/ms");
      break;
    case AudioManagerEvents.buffering:
      print("buffering $args");
      break;
    case AudioManagerEvents.playstatus:
      isPlaying = AudioManager.instance.isPlaying;
      setState(() {});
      break;
    case AudioManagerEvents.timeupdate:
      _position = AudioManager.instance.position;
      _slider = _position.inMilliseconds / _duration.inMilliseconds;
      setState(() {});
      AudioManager.instance.updateLrc(args["position"].toString());
      break;
    case AudioManagerEvents.error:
      _error = args;
      setState(() {});
      break;
    case AudioManagerEvents.ended:
      AudioManager.instance.next();
      break;
    case AudioManagerEvents.volumeChange:
      _sliderVolume = AudioManager.instance.volume;
      setState(() {});
      break;
    default:
      break;
  }
});

}

Now when I’m playing next song for example setstate will refresh my whole app. How can I only rebuild a specific file of my project when event is triggered?

For example let’s say we have main.dart file home.dart , news.dart and on event AudioManagerEvents.next I only want setstate for my file News.dart, how to do this?

Thank you for the help!

jeromexiong commented 4 years ago

you should use provider

------------------ Original ------------------ From: md186 <notifications@github.com> Date: Mon,May 11,2020 11:26 PM To: jeromexiong/audio_manager <audio_manager@noreply.github.com> Cc: Subscribed <subscribed@noreply.github.com> Subject: Re: [jeromexiong/audio_manager] How can I rebuild only single widgets of my app (#25)

Hey there Hope you can help me out. I’m using the following code in my main.dart file:

String _platformVersion = 'Unknown'; bool isPlaying = false; Duration _duration; Duration _position; double _slider; double _sliderVolume; String _error; num curIndex = 0; PlayMode playMode = AudioManager.instance.playMode;

final list = [ { "title": "Assets", "desc": "local assets playback", "url": "assets/audio.mp3", "coverUrl": "assets/ic_launcher.png" }, { "title": "network", "desc": "network resouce playback", "url": "https://dl.espressif.com/dl/audio/ff-16b-2c-44100hz.m4a", "coverUrl": "https://homepages.cae.wisc.edu/~ece533/images/airplane.png" } ];

@override void initState() { super.initState(); initPlatformState(); setupAudio(); // loadFile();
}

@override void dispose() { // 释放所有资源 AudioManager.instance.stop(); super.dispose(); }

void setupAudio() { List _list = []; list.forEach((item) => _list.add(AudioInfo(item["url"], title: item["title"], desc: item["desc"], coverUrl: item["coverUrl"]))); AudioManager.instance.audioList = _list; AudioManager.instance.intercepter = true; AudioManager.instance.play(auto: false); AudioManager.instance.onEvents((events, args) { print("$events, $args"); switch (events) { case AudioManagerEvents.start: print("start load data callback"); _position = AudioManager.instance.position; _duration = AudioManager.instance.duration; _slider = 0; setState(() {}); break; case AudioManagerEvents.ready: print("ready to play"); _error = null; _sliderVolume = AudioManager.instance.volume; _position = AudioManager.instance.position; _duration = AudioManager.instance.duration; setState(() {}); // if you need to seek times, must after AudioManagerEvents.ready event invoked // AudioManager.instance.seekTo(Duration(seconds: 10)); break; case AudioManagerEvents.seekComplete: _position = AudioManager.instance.position; _slider = _position.inMilliseconds / _duration.inMilliseconds; setState(() {}); print("seek event is completed. position is [$args]/ms"); break; case AudioManagerEvents.buffering: print("buffering $args"); break; case AudioManagerEvents.playstatus: isPlaying = AudioManager.instance.isPlaying; setState(() {}); break; case AudioManagerEvents.timeupdate: _position = AudioManager.instance.position; _slider = _position.inMilliseconds / _duration.inMilliseconds; setState(() {}); AudioManager.instance.updateLrc(args["position"].toString()); break; case AudioManagerEvents.error: _error = args; setState(() {}); break; case AudioManagerEvents.ended: AudioManager.instance.next(); break; case AudioManagerEvents.volumeChange: _sliderVolume = AudioManager.instance.volume; setState(() {}); break; default: break; } });
}

Now when I’m playing next song for example setstate will refresh my whole app. How can I only rebuild a specific file of my project when event is triggered?

For example let’s say we have main.dart file home.dart , news.dart and on event AudioManagerEvents.next I only want setstate for my file News.dart, how to do this?

Thank you for the help!

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub, or unsubscribe.

md186 commented 4 years ago

@jeromexiong thank you for the reply, sounds good. I’m using provider package from google, can you give me an example how it would look line with provider when we want to put AudioManagerEvents.instance.next in provider for example?

Would be great if you give me an example so I can learn from it