web-dev-qa-db-fra.com

Vérifiez si le widget sans état est disposé dans le flottement

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é?

5
Flutter IO Dev

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();
}
2
Kirollos Morkos