在Flutter中使用单例vs提供程序?

时间:2020-06-25 16:15:17

标签: flutter flutter-dependencies flutter-provider

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

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);
}

}

现在我可以访问此类以检索相关数据?。 运行getLocalSongs将所有本地歌曲的列表保存到该类的songs变量中。但是,每次创建AudioFunctions对象时,都必须运行此程序。因此,在每个屏幕上。?

我应该使用单例还是提供者?由于我是新手,所以我不知道如何使用它们中的任何一个,并且怀疑是否可以在provider中使用对象。?

表达爱意?并帮助菜鸟

1 个答案:

答案 0 :(得分:1)

我认为单例是一个不错的选择,因为您可能不想在每个页面上再次调用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._(),以便不能再在文件外部调用它。