Дублируется интерфейс при использовании audio service Flutter
Разрабатываю радио на flutter использую audio_service и just_audio. Есть несколько проблем.
- После того как приложение закрывается и убирается с памяти, а потом обратно запускаем его, фоновый интерфейс открывается обратно, но предыдущий не закрывается, таким образом создается много дублей, которые в свою очередь еще и не работают.

- После закрытия приложения и выгрузки его с памяти, музыку не возможно запустить, нажимаю на 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']);
});
}