首页 > 解决方案 > 如何在 Flutter 上使用 audio_service 使用本地化的 MediaItem 标题和专辑

问题描述

我在我的 Flutter 应用程序中使用audio_service包。在所有示例中,它们MediaItem要么出现在从另一个类扩展BackgroundAudioTask或从另一个类传递的类中,但它们最后是硬编码的。

在我的项目中,我只有一个MediaItem(无论播放的声音如何),我想在其中使用本地化字符串MediaItem

问题是BackgroundAudioTask不会给你一个BuildContext,所以你不能从你的BackgroundAudioTask.

到目前为止,我尝试过onUpdateMediaItemBackgroundAudioTask这样覆盖:

@override
onUpdateMediaItem(MediaItem mediaItem) async {
  AudioServiceBackground.setMediaItem(mediaItem);
}

并将 MediaItem 设置在 之外BackgroundAudioTask,如下所示:

final mediaItem = MediaItem(
    id: "my-fixed-id",
    album: AppLocalizations.of(context).translate('media_item_album'),
    title: AppLocalizations.of(context).translate('media_item_title'),
);
AudioService.updateMediaItem(mediaItem);

问题是我不知道把第二个代码块放在哪里。我不能把它放在我的 App 类中,因为本地化还没有在那里初始化,我不确定把它放在页面屏幕中是否有意义,因为这个MediaItems 是用于服务的,不应该被绑定到一个屏幕。

你能帮我使用MediaItems 的本地化字符串吗?

提前致谢!

标签: flutteraudio

解决方案


我是这样解决的:

在我的后台任务中:

@override
Future<void> onUpdateMediaItem(MediaItem mediaItem) async {
  AudioServiceBackground.setMediaItem(mediaItem);
}

在我HomePagerunning事件流中,获取字符串值,然后设置媒体项:

@override
void initState() {
  super.initState();
  _setMediaItem();
}

void _setMediaItem() {
  AudioService.runningStream.listen((bool isRunning) {
    if (isRunning) {
      AudioService.updateMediaItem(
        MediaItem(
          id: "ambiance-sound-mix",
          album: AppLocalizations.of(context).getString("media_item_album"),
          title: AppLocalizations.of(context).getString("media_item_title"),
        ),
      );
    }
  });
}

PS:我还尝试切换到easy_localization认为可以解决问题,因为它不需要BuildContext查找字符串值。但是这不起作用,因为当您尝试从 audio_service's 获取字符串值时BackgroundAudioTask,EasyLocalization 失败,因为它无法instance使用加载的字符串访问它并尝试从空字符串映射中获取字符串。


推荐阅读