Как изменить текущий mediaItem при воспроизведении следующего mediaItem в очереди

Я разрабатываю приложение для iOS во Flutter, используя пакет audio_service. я использую AudioServiceBackground.serQueue() чтобы установить несколько MediaItem в очередь.

В части пользовательского интерфейса я пытаюсь использовать AudioService.currentMediaItemStream для отображения информации о воспроизводимом в данный момент медиа-элементе.

Когда первая песня в очереди закончится, будет воспроизведена вторая песня. Однако информация о текущем медиа-элементе не меняется.

Как определить, что песня, играющая в очереди, изменилась?

      class AudioServiceScreen extends StatefulWidget {
  @override
  _AudioServiceScreenState createState() => _AudioServiceScreenState();
}

class _AudioServiceScreenState extends State<AudioServiceScreen> {
  @override
  void initState() {
    super.initState();
    Future(() async {
      await AudioService.connect();
      await start();
    });
  }

  @override
  void dispose() {
    Future(() async {
      await AudioService.disconnect();
    });
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: ///,
      body: StreamBuilder<MediaItem?>(
        stream: AudioService.currentMediaItemStream,
        builder: (context, snapshot) {
          final mediaItem = snapshot.data;
        },
      ),
    );
  }

  Future<dynamic> start() async {
    final success = await AudioService.start(
      backgroundTaskEntrypoint: _backgroundTaskEntrypoint,
    );
    if (success) {
      await updateQueue();
    }
  }

  Future<void> updateQueue() async {
    final queue = await getMediaLibrary();  // get data from FireStore
    await AudioService.updateQueue(queue);
  }
}

void _backgroundTaskEntrypoint() {
  AudioServiceBackground.run(() => AudioPlayerTask());
}

class AudioPlayerTask extends BackgroundAudioTask {
  final AudioPlayer audioPlayer = AudioPlayer();

  @override
  Future<void> onStart(Map<String, dynamic>? params) async {
    final session = await AudioSession.instance;
    await session.configure(const AudioSessionConfiguration.speech());

    await AudioServiceBackground.setState(
      controls: [MediaControl.pause, MediaControl.stop],
      playing: false,
      processingState: AudioProcessingState.connecting,
    );
  }

  @override
  Future<void> onUpdateQueue(List<MediaItem> queue) async {
    await AudioServiceBackground.setQueue(queue);

    try {
      await audioPlayer.setAudioSource(ConcatenatingAudioSource(
        children:
            queue.map((item) => AudioSource.uri(Uri.parse(item.id))).toList(),
      ));
    } on Exception catch (e) {
      await onStop();
    }
  }
}

1 ответ

Попробуйте прочитать документацию и следовать некоторым из приведенных там примеров. Потому что в разделе «Фоновый код» есть код «при запуске». Может быть, этот код поможет вам. Мне очень жаль, что я не могу вам так сильно помочь. Я никогда не пробовал этот пакет.

Другие вопросы по тегам