Дублируется интерфейс при использовании audio service Flutter

Разрабатываю радио на flutter использую audio_service и just_audio. Есть несколько проблем.

  1. После того как приложение закрывается и убирается с памяти, а потом обратно запускаем его, фоновый интерфейс открывается обратно, но предыдущий не закрывается, таким образом создается много дублей, которые в свою очередь еще и не работают. Куча дублей
  2. После закрытия приложения и выгрузки его с памяти, музыку не возможно запустить, нажимаю на play и ничего не происходит. Не работают после закрытия приложения

Инициализирую в main.dart late AudioHandler audioHandler;

Future<void> main() async {

WidgetsFlutterBinding.ensureInitialized(); MobileAds.instance.initialize();

audioHandler = await AudioService.init( builder: () => AudioPlayerHandler(), config: const AudioServiceConfig( androidNotificationChannelId: 'com.mycompany.myapp.channel.audio', androidNotificationChannelName: 'Music playback', androidNotificationOngoing : true, androidStopForegroundOnPause: true, androidNotificationIcon: 'drawable/fone_start' ) );

runApp(const MyApp()); }

AudioPlayerHandler() в отдельном файле

final audioPlayer = AudioPlayer(); late MediaItem mediaItem_;

class AudioPlayerHandler extends BaseAudioHandler with SeekHandler {
  Initialise our audio handler.
  AudioPlayerHandler() {
    audioPlayer.playbackEventStream.map(_transformEvent).pipe(playbackState);
  }



  @override
  Future<void> updateMediaItem(MediaItem mediaItem) async {
    mediaItem_ = mediaItem;
    this.mediaItem.add(mediaItem);
  }


  @override
  Future<void> play() async {
    // TODO: implement play
    checkInternet.check().then((response) async {
      print('Start Play 2');
      if(response) {
        audioPlayer.play();
        return super.play();
      } else {
        return super.pause();
      }
    });
  }

  @override
  Future<void> pause() {
    // TODO: implement pause
    print('Pause');
    audioPlayer.pause();
    return super.pause();
  }

  @override
  Future<void> stop() async {
    audioPlayer.dispose();
    return super.stop();
  }

  PlaybackState _transformEvent(PlaybackEvent event) {
    return PlaybackState(
      controls: [
        audioPlayer.playing ? MediaControl.pause : MediaControl.play,
      ],
      androidCompactActionIndices: const [0],
      processingState: const {
        ProcessingState.idle: AudioProcessingState.idle,
        ProcessingState.loading: AudioProcessingState.loading,
        ProcessingState.buffering: AudioProcessingState.buffering,
        ProcessingState.ready: AudioProcessingState.ready,
        ProcessingState.completed: AudioProcessingState.completed,
      }[audioPlayer.processingState]!,
      playing: audioPlayer.playing,
      updatePosition: audioPlayer.position,
      bufferedPosition: audioPlayer.bufferedPosition,
      speed: audioPlayer.speed,
      queueIndex: event.currentIndex,
    );
  }
}

Подгружаю инфу по станции в home.dart

final item = MediaItem(
        id: stationData['url'],
        //album: "Science Friday",
        title: stationData['title'] ?? '',
        artist: stationData['short_text'] ?? '',
        //duration: const Duration(milliseconds: 5739820),
        artUri: Uri.parse(stationData['picture']),
      );

      audioHandler.updateMediaItem(item);

Запускаю музыку при открытии страницы show.dart или по клику на play на этой же странице show.dart

    void musicPlay(BuildContext context) async {
    checkInternet.check().then((response) async {
      if(response) {
        try {
          await audioPlayer.setUrl(stationData['url']);
          await audioPlayer.setAudioSource(AudioSource.uri(Uri.parse(stationData['url'])));
          audioHandler.play();
          context.read<Data>().changePlaying(true);
          context.read<Data>().changeLoading(false);
        } catch(e) {
          context.read<Data>().changeErrorStation(true);
          stationError(context);
        }
      } else {
        context.read<Data>().changeLoading(false);
      }
      context.read<Data>().changeInternet(response);
      context.read<Data>().changeStationActiveId(stationData['id']);
    });
  }

Ответы (0 шт):