繁体   English   中英

在 Flutter 中使用 singleton 与提供商?

[英]Using singleton vs provider in Flutter?

我正在flutter开发音乐播放器应用程序。我正在使用音频播放器插件来获取所有 mp3 文件并播放音乐。 我创建了一个单独的AudioFunctions class 来完成所有这些过程,如下所示。

class AudioFunctions{
  FlutterAudioQuery audioQuery;
  AudioPlayer audioPlayer;
  List<SongInfo> songs;

AudioFunctions(){
  this.audioQuery = FlutterAudioQuery();
  this.audioPlayer = AudioPlayer();
  this.songs = [];
}

getLocalSongs() async => this.songs = await audioQuery.getSongs();

String optimiseSongTitles(int index){
  String songTitle = '';

  if (this.songs[index].displayName.contains('-')){
    songTitle = this.songs[index].displayName.split('-')[0];
  }
  else if(this.songs[index].displayName.contains('_')){
    songTitle = this.songs[index].displayName.split('_')[0];
  }

  return songTitle;
}

void playLocalSong(String path){
  audioPlayer.play(path,isLocal: true,);
}

void pauseLocalSong(){
  audioPlayer.pause();
}

Stream<Duration> getLength() {
  return audioPlayer.onDurationChanged;
}

Stream<Duration> getPosition() {
  return audioPlayer.onAudioPositionChanged;
}

Future<int> changeSlider(Duration d){
  return audioPlayer.seek(d);
}

}

现在我可以访问这个 class 来检索相关数据。 运行getLocalSongs会将所有本地歌曲的列表保存到 class 中的songs变量中。但是,每次创建 AudioFunctions 的 object 时,我都必须运行它。 所以,在每个屏幕上。

我应该使用 singleton 还是提供商 由于我是 flutter 的新手,我不知道如何使用它们中的任何一个,我怀疑我是否可以在提供程序中使用对象。

表现出一些爱并帮助一个菜鸟

我认为 singleton 在这里是一个不错的选择,因为您可能不想在每个页面上再次调用 AudioPlayer()。

class AudioFunctions {
  static AudioFunctions _instance = AudioFunctions._();
  FlutterAudioQuery audioQuery;
  AudioPlayer audioPlayer;
  List<SongInfo> songs;
  
  static AudioFunctions get instance => _instance;

  AudioFunctions._() {
    this.audioQuery = FlutterAudioQuery();
    this.audioPlayer = AudioPlayer();
    this.songs = [];
  }

  getLocalSongs() async => this.songs = await audioQuery.getSongs();
}

现在要访问 AudioFunctions,您可以调用AudioFunctions.instance 我已将您的构造函数更改为AudioFunctions._()以便不再在文件外部调用它。

如果您想使用它来存储需要从应用程序的不同区域访问的全局 state,则将提供程序创建为 singleton 可能是有意义的。 通过这样做,您可以在整个应用程序中访问相同的提供程序实例,并且对提供程序的 state 的任何更改都将立即被应用程序的所有依赖区域看到。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM