Lorsque mon widget sans état est construit, je joue certains sons dans l'ordre des séquences en utilisant ce code:
await _audioPlayer.play(contentPath1, isLocal: true);
await Future.delayed(Duration(seconds: 4));
await _audioPlayer.play(contentPath2, isLocal: true);
await Future.delayed(Duration(seconds: 4));
await _audioPlayer.play(contentPath3, isLocal: true);
lorsque l'utilisateur ferme le widget actuel avant de terminer la lecture des sons, les sons fonctionnent toujours même après la fermeture de l'itinéraire actuel en utilisant ce code:
Navigator.pop(context);
ma solution consiste à utiliser une variable booléenne pour indiquer si l'action de fermeture a été effectuée.
Lecture du code son:
await _audioPlayer.play(contentPath1, isLocal: true);
if (closed) return;
await Future.delayed(Duration(seconds: 4));
if (closed) return;
await _audioPlayer.play(contentPath2, isLocal: true);
if (closed) return;
await Future.delayed(Duration(seconds: 4));
if (closed) return;
await _audioPlayer.play(contentPath3, isLocal: true);
Fermer le widget actuel:
closed = true;
_audioPlayer.stop();
Existe-t-il un meilleur moyen d'arrêter les méthodes asynchrones si mon widget est fermé?
Si vous changez votre widget en StatefulWidget, vous pouvez avoir une fonction comme celle-ci:
void _playSounds() {
await _audioPlayer.play(contentPath1, isLocal: true);
await Future.delayed(Duration(seconds: 4));
if (!mounted) return;
await _audioPlayer.play(contentPath2, isLocal: true);
await Future.delayed(Duration(seconds: 4));
if (!mounted) return;
await _audioPlayer.play(contentPath3, isLocal: true);
}
puis dans la méthode d'élimination, éliminez simplement le lecteur:
@override
void dispose() {
_audioPlayer?.dipose();
super.dispose();
}