如何在 Flutter 上使用 audio_service 使用本地化的 MediaItem 标题和专辑

How to use localized MediaItem title and album using audio_service on Flutter

我在我的 Flutter 应用程序中使用 audio_service 包。 在所有示例中,MediaItem 要么出现在从 BackgroundAudioTask 扩展的 class 中,要么从另一个 class 传递过来,但它们最后是 hard-coded..

在我的项目中,我只有一个 MediaItem(不管播放的声音如何),我想在 MediaItem.

中使用本地化字符串

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

得到本地化的字符串

到目前为止,我尝试在 BackgroundAudioTask 中覆盖 onUpdateMediaItem,如下所示:

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

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

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);

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

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

提前致谢!

我是这样解决的:

在我的后台任务中:

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

在我的 HomePage 中,我收听了 running 事件流,获取字符串值,然后设置媒体项:

@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 的 BackgroundAudioTask 获取字符串值时,EasyLocalization 失败,因为它无法使用加载的字符串访问其 instance 并尝试获取字符串来自空字符串映射..