在 Flutter 中使用单例与提供者?
Using singleton vs provider in Flutter?
我正在用 flutter 开发音乐播放器应用程序。我正在使用 audioplayers 插件来获取所有 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 对象时,我都必须 运行。所以,在每个屏幕上。
我应该使用单例还是提供者?由于我是 flutter 的新手,我不知道如何使用它们中的任何一个,我怀疑我是否可以在 provider 中使用对象。
表达爱意,帮助菜鸟
我认为单例在这里是一个不错的选择,因为您可能不想在每个页面上再次调用 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._()
,这样就无法再在文件外部调用它。
我正在用 flutter 开发音乐播放器应用程序。我正在使用 audioplayers 插件来获取所有 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 对象时,我都必须 运行。所以,在每个屏幕上。
我应该使用单例还是提供者?由于我是 flutter 的新手,我不知道如何使用它们中的任何一个,我怀疑我是否可以在 provider 中使用对象。
表达爱意,帮助菜鸟
我认为单例在这里是一个不错的选择,因为您可能不想在每个页面上再次调用 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._()
,这样就无法再在文件外部调用它。