Exécuter un fonction avant la fermeture d'un state

Bonjour j’espère que vous aller bien, mon code me permet de jouer de la musique. Le soucis est que quand je quitte la page la musique continue de jouer et je ne voudrais pas qu’il en soit ainsi.
Est-ce qu’il aurait un code qui permet de lancer un fonction avant la fermeture de cette vue, ainsi je pourrait utiliser la fonction advancedPlayer.stop() pour arrêter la musique.

import 'package:flutter/material.dart';

import 'package:audioplayers/audio_cache.dart';

import 'package:audioplayers/audioplayers.dart';

class ComponentAudioPayer extends StatefulWidget {

  @override

  _ComponentAudioPayerState createState() => _ComponentAudioPayerState();

}

class _ComponentAudioPayerState extends State<ComponentAudioPayer> {

  Duration _duration = Duration();

  Duration _position = Duration();

  AudioPlayer advancedPlayer;

  AudioCache audioCache;

  @override

  void initState() {

    super.initState();

    initPlayer();

  }

  @override

  void dispose() {

    super.dispose();

  }

  initPlayer() {

    advancedPlayer = AudioPlayer();

    audioCache = AudioCache(fixedPlayer: advancedPlayer);

    advancedPlayer.durationHandler = (d) => setState(() {

          _duration = d;

        });

    advancedPlayer.positionHandler = (p) => setState(() {

          _position = p;

        });

  }

  String localFilePath;

  Widget _tab(List<Widget> children) {

    return Column(

      mainAxisAlignment: MainAxisAlignment.center,

      children: [

        Container(

          padding: EdgeInsets.all(16.0),

          child: Column(

            children: children

                .map((w) => Container(child: w, padding: EdgeInsets.all(6.0)))

                .toList(),

          ),

        ),

      ],

    );

  }

  Widget _btn(String txt, VoidCallback onPressed) {

    return ButtonTheme(

      minWidth: 48.0,

      child: Container(

        width: 150.0,

        height: 45.0,

        child: RaisedButton(

          shape:

              RoundedRectangleBorder(borderRadius: BorderRadius.circular(25.0)),

          child: Text(txt),

          color: Colors.pink[900],

          textColor: Colors.white,

          onPressed: onPressed,

        ),

      ),

    );

  }

  Widget slider() {

    return Slider(

      activeColor: Colors.black,

      inactiveColor: Colors.pink,

      value: _position.inSeconds.toDouble(),

      min: 0.0,

      max: _duration.inSeconds.toDouble(),

      onChanged: (double value) {

        setState(() {

          seekToSecond(value.toInt());

          value = value;

        });

      },

    );

  }

  Widget localAudio() {

    return _tab([

      _btn("Play", () => audioCache.play("Tfila.mp3")),

      _btn("Pause", () => advancedPlayer.pause()),

      _btn("Stop", () => advancedPlayer.stop()),

      slider(),

    ]);

  }

  void seekToSecond(int second) {

    Duration newDuration = Duration(seconds: second);

    advancedPlayer.seek(newDuration);

  }

  @override

  Widget build(BuildContext context) {

    return Scaffold(

      body: Center(

        child: Column(

          mainAxisAlignment: MainAxisAlignment.spaceEvenly,

          children: [

            localAudio()

          ],

        ),

      ),

    );

  }

}

Il faudrait écouter l’état de la page et quand le statut change dans ce cas là tu execute ta fonction.

C’est juste une idée, je ne sais pas si ça peut marcher

Tu peux utiliser le void dispose(){} qui est appelé quand ta classe est détruite.
Cette fonction est disponible dans un statefulWidget.

À utiliser comme initState().

2 J'aime

:sweat_smile: :sweat_smile: J’avais écrit le code et sans l’essayer je l’ai supprimé parce que on l’avait utiliser pour une animation, merci.