Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Check if Stateless widget is disposed in flutter

When my stateless widget built I play some sounds in sequence order by using this 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);

when the user closes the current widget before finish playing the sounds, The sounds still work even after closing the current route by using this code:

Navigator.pop(context);

my workaround is to use a boolean variable to indicate if the closing action has done.

Playing sound code:

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);

Closing the current widget:

closed = true;
_audioPlayer.stop();

Are there a better way to stop the async methods if my widget closed?

like image 712
Flutter IO Dev Avatar asked Oct 21 '18 17:10

Flutter IO Dev


1 Answers

If you change your widget to a StatefulWidget then you can have a function like the following:

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);
}

and then in the dispose method just dispose of the player:

@override
void dispose() {
  _audioPlayer?.dispose();
  super.dispose();
}
like image 129
Kirollos Morkos Avatar answered Sep 21 '22 19:09

Kirollos Morkos