簡體   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