在 Flutter 中使用单例与提供者?

Posted

技术标签:

【中文标题】在 Flutter 中使用单例与提供者?【英文标题】:Using singleton vs provider in Flutter? 【发布时间】:2020-10-16 04:07:56 【问题描述】:

我正在开发音乐播放器应用程序????在颤抖中。我正在使用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 对象时,我都必须运行它。那么,在每个屏幕上.????

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

表达爱意????并帮助一个菜鸟????

【问题讨论】:

你可以在提供者中使用任何你想要的东西。单例的问题在于测试,这会很困难。 【参考方案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._(),这样就不能再在文件外调用它了。

【讨论】:

感谢您的回复。 “不再在文件外调用”是什么意思。如果您能指导我阅读任何有关此的文章,那将很有帮助。我相信我有很多东西要学。 这不是必需的,但它有助于保持对项目的清晰概述。在您的情况下,您不需要在任何地方调用构造函数,因为您始终拥有 Singleton 实例。文章A tour of the Dart language 描述了私有标识符:Unlike Java, Dart doesn’t have the keywords public, protected, and private. If an identifier starts with an underscore (_), it’s private to its library. For details, see Libraries and visibility. 例如,变量:int _privateVariable; 由于_ 也只能在文件中访问。 我遇到了一个错误。我尝试使用以下代码调用函数getLocalSongs 但我收到此错误instance member cannot be accessed using static access 我在应用程序的启动屏幕中使用此代码。 @overridevoid initState() `super.initState();``initializePlayer();````void initializePlayer()异步``AudioFunctions.instance.getLocalSongs();``` ? 我尝试将_instance 设为静态但不知道我也必须将getter 设为静态。我继续使用提供程序及其现在的工作。我应该将其更改为单例吗?是不是更有效率?再次感谢

以上是关于在 Flutter 中使用单例与提供者?的主要内容,如果未能解决你的问题,请参考以下文章

处理古怪的 API JSON 响应体 --- 单例与数组 [重复]

Spring单例与线程安全小结

单例与原型 JdbcTemplate

如何使用 Swift 3 将单例与 Alamofire 一起使用?

java使用单例与使用static方法的对于和个人理解

单例与Java中具有静态成员和方法的类[重复]