es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Flutter: Pantalla de video no se cierra al terminar cuando se implementa WillPopScope.

Recientemente implementé WillPopScope en el paquete VideoPlayer de mi aplicación:

child: WillPopScope(
                  onWillPop: () async => false,
                  child: VideoPlayer(_controller),
                ),

Lo uso para evitar que se active la función de retroceso al deslizar, lo cual funciona bien.

Sin embargo, ha resultado en otro error. Cuando el VideoPlayer se completa, debería cerrar la pantalla y esto ya no está ocurriendo. Antes funcionaba correctamente.

Aquí está mi código de salida de pantalla:

void closeScreen() async {
  final _exercises = Provider.of<Exercises>(context, listen: false);
  _exercises.increasePlayCount(widget.exercise.id);
  print('VIDEO FINISHED ... CLOSE!!');
  widget.exercise.setRecentPlayed(widget.exercise);
  Navigator.of(context).maybePop();
  SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual,
    overlays: [SystemUiOverlay.top]);
}

Este método se está llamando correctamente, ya que se ejecuta la declaración de impresión como se esperaba.

He intentado cambiar la ubicación de WillPopScope pero eso no ha solucionado el problema. ¿Alguien podría informarme cómo puedo corregir esto?

Muchas gracias.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Basándome en el código e información proporcionados, parece que la implementación de WillPopScope podría estar afectando la capacidad de VideoPlayer para cerrar la pantalla cuando se completa la reproducción. Una solución potencial podría ser eliminar el parámetro onWillPop del widget WillPopScope y en su lugar utilizar un método separado para evitar el retorno con gesto de deslizamiento:

    class MyScreen extends StatelessWidget {
      final VideoPlayerController _controller;
    
      MyScreen(this._controller);
    
      Future<bool> _onWillPop() async {
        return false;
      }
    
      void _closeScreen() {
        final _exercises = Provider.of<exercises>(context, listen: false);
        _exercises.increasePlayCount(widget.exercise.id);
        print('¡¡VIDEO FINALIZADO ... CERRAR!!');
        widget.exercise.setRecentPlayed(widget.exercise);
        Navigator.of(context).maybePop();
        SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual,
          overlays: [SystemUiOverlay.top]);
      }
    
      @override
      Widget build(BuildContext context) {
        return WillPopScope(
          onWillPop: _onWillPop,
          child: Scaffold(
            appBar: AppBar(
              title: Text('Mi Pantalla'),
            ),
            body: Center(
              child: VideoPlayer(_controller),
            ),
            floatingActionButton: FloatingActionButton(
              onPressed: _closeScreen,
              child: Icon(Icons.close),
            ),
          ),
        );
      }
    }
    

    En este ejemplo, en lugar de utilizar onWillPop para evitar la vuelta atrás con gesto de deslizamiento, se crea un método separado llamado _onWillPop y se utiliza en el widget WillPopScope. El método closeScreen ahora se llama _closeScreen y se llama cuando el usuario toca el botón de acción flotante.

    Esto debería permitir que VideoPlayer cierre la pantalla cuando se complete la reproducción, sin interferir con el gesto de deslizamiento de vuelta atrás.

Comments are closed.