web-dev-qa-db-ja.com

ステートレスウィジェットがフラッターに配置されているかどうかを確認する

ステートレスウィジェットが作成されたら、次のコードを使用していくつかのサウンドをシーケンス順に再生します。

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

ユーザーがサウンドの再生を完了する前に現在のウィジェットを閉じると、次のコードを使用して現在のルートを閉じた後でもサウンドは機能します。

Navigator.pop(context);

私の回避策は、ブール変数を使用して、閉じるアクションが完了したかどうかを示すことです。

サウンドコードの再生:

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

現在のウィジェットを閉じる:

closed = true;
_audioPlayer.stop();

ウィジェットが閉じた場合に非同期メソッドを停止するより良い方法はありますか?

5
Flutter IO Dev

ウィジェットをStatefulWidgetに変更すると、次のような関数を持つことができます。

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

次に、disposeメソッドで、プレーヤーを破棄します。

@override
void dispose() {
  _audioPlayer?.dipose();
  super.dispose();
}
2
Kirollos Morkos