flutter audioplayers 新增平台适配

2023年 8月 13日 23.9k 0

flutter -- 音频播放 audioplayers新增平台适配

相信使用过flutter的开发者应该都对audioplayers这个插件不陌生,这是一个音频播放器的插件,可以适用于Windows,mac,linux,ios等平台。由于使用起来简单,因此在音频播放器中的流行度还是很高的。关于如何使用网络上已经有很多的资源,感兴趣的读者可以自行查阅。本文的重点是如何在这一插件的基础上,新增一个平台的适配。例如,我想在A操作系统上使用audioplayers插件,该如何进行扩展,以及生成的packages改如何维护。

官方文档说明

先上官网链接:先上官网链接: pub.dev/packages/au…

在audioplayers_platform_interface工程中,我们可以看到官网描述,翻译过来的意思大致就是,如果我们想实现一个特定的平台,那我们需要继承AudioplayersPlatformInterface这个类。然后当我们将我们的plugin注册到flutter引擎的时候,我们需要把AudioplayersPlatformInterface的instance属性赋成我们所定义的类的类型。另外,需要注意一点的是,AudioplayersPlatformInterface其实在在5.0.0版本及以后才更改成这个名字的,在5.0.0之前的版本,我们需要继承类的名字是AudioplayersPlatform。由于笔者的flutter版本是3.0.4,对应的sdk版本为2.17.5,因此本文以继承AudioplayersPlatform为实例进行演示。

代码实现

正如前文所说,我们要想新增自己平台的实现,那我们需要去继承AudioplayersPlatform这一抽象类,那为什么是这样呐,我们可以去看一下audioplayers的代码(笔者使用的AudioplayersPlatform版本为1.0.0,因此需要找对应版本的audioplayers1.0.0的代码.

class AudioPlayer {
  static final _platform = AudioplayersPlatform.instance;   
};

首先我们可以看到在AudioPlayer这个类中,有一个_platform的属性,它的值正好是我们要继承类的instance属性。我们在看AudioPlayer中play这个函数的执行,看它是如何和_platform这个属性扯上关系的


Source source, {

double? volume,

AudioContext? ctx,

Duration? position,

PlayerMode? mode,

}) async {

if (mode != null) {

await setPlayerMode(mode);

}

if (volume != null) {

await setVolume(volume);

}

if (ctx != null) {

await setAudioContext(ctx);

}

if (position != null) {

await seek(position);

}

await setSource(source);

print("play audio");

return resume();

}

我们可以看到play函数最终调用到了resume()函数上,目前还没有看到_platform的出现,我们接着看resume函数的实现.

Future resume() async {
await _platform.resume(playerId);
}

可以看到_platform在这个地方出现了,也就说我们继承AudioplayersPlatform这个类,然后将它的instance属性用我们自定义类去进行赋值,当我们使用插件时,就会通过_platform去实现我们新增平台播放器的功能了。具体代码实现如下.例如,我们想要新增一个操作系统下的实现,假设这个操作系统的名字为A,那我们的代码可以实现如下

class A extends AudioplayersPlatform {
    static void registerWith() {
        AudioplayersPlatform.instance = A();
    }
}

至于代码里的registerWith函数,其实是flutter会在编译的时候生成的函数,该函数的功能主要是将我们新实现的插件注册到flutter engine里,这也正好印证了文档里我们将插件注册到引擎的时候,将instance属性赋值成我们自定义平台的实现。接下来就是我们自定义平台播放器的实现,由于每个平台的实现不同,这里将不详细展开。

packages维护

关于flutter中packages的维护,官网文档里其实已经有了很详细的介绍,主要就是在pubspec.yaml文件中添加,然后通过flutter pub get去对插件进行更新。另外对于插件包也分为纯dart包以及一些原生代码实现的package,具体的描述可以参照flutter.cn/docs/develo… ,官方文档下会有详细的介绍.笔者采取的是纯dart开发,因此笔者的pubspec.yaml文件类似如下:

flutter:
    plugin:
        implements:audioplayers
        platforms:A # 这里代表您要实现的平台的名字,本文以A代替
        dartPluginClass: A # 这里代表您所实现的类的名字,本文的名字A,按需替换成自己的类名即可.

提到这里,不得不提到flutter的一个优点,也是在项目中碰到的好处。针对audioplayers如果您自己实现了一个linux平台下的音乐播放器插件,当您引入audioplayers时,系统会以您自定义实现的linux平台下的播放器为主,而不是使用audioplayers所使用的linux平台下的插件的实现.综上就是audioplayers如何新增一个自己平台实现的具体方法了。

相关文章

服务器端口转发,带你了解服务器端口转发
服务器开放端口,服务器开放端口的步骤
产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
如何使用 WinGet 下载 Microsoft Store 应用
百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

发布评论