Red de conocimiento informático - Aprendizaje de programación - Flutter comparte el código fuente.

Flutter comparte el código fuente.

Nota: El nivel de brillo y el gif de ajuste de volumen no se reflejan en el gif, pero las funciones están bien. En segundo lugar, el icono de bloqueo predeterminado es muy difícil de distinguir entre activado y desactivado.

Entorno: Flutter 2.8.1 canal estable; Dart 2.15.1

Si necesitas un reproductor de audio, mira aquí: Reproductor de música Flutter.

Nos centramos en esta clase de herramienta porque la reproducción de vídeo implica muchos cambios de estado. Inicialmente, el autor optó por utilizar InheritedWidget para compartir datos entre muchos widgets. ¡Pero siempre siento que esto es un poco engorroso y poco elegante!

Esto no es un anuncio. Es muy simple si usas GetX. El autor también usa GetX para empaquetar, ¡lo cual es muy rápido! Pero el autor sigue diciendo lo mismo: GetX no se recomienda para desarrolladores nuevos en Flutter. Antes de usarlo, puede familiarizarse con los principios básicos de la gestión del estado de aleteo. Y para ser lo más concisos posible, todavía no presentamos a otros terceros.

Las razones por las que elegimos empaquetar complementos de terceros son las siguientes:

Así que escribí una clase de herramienta, VideoPlayerUtils, específicamente para manejar todos los negocios del reproductor. Incluyendo operaciones como pausar, reproducir, saltar, ajustar el volumen, ajustar el brillo, cambiar videos, etc. Todos los widgets no harán referencia a ninguna información de video_player u otros complementos de terceros. VideoPlayerUtils es responsable de todas las interacciones operativas entre el widget y el reproductor. Las iteraciones de optimización posteriores o el reemplazo de complementos del reproductor solo requieren modificaciones en esta clase de herramienta, que no tendrá ningún impacto en todos los widgets y se desacoplará en gran medida.

Entre ellos, VideoPlayerState:

Para proporcionar los atributos públicos * * * anteriores, puede obtener los valores correspondientes a través de VideoPlayerUtils y usar get de solo lectura, de modo que el mundo exterior no modificará estos atributos por error, garantizando así la seguridad del valor. Los desarrolladores pueden agregar atributos según sus necesidades.

Los métodos anteriores se proporcionan para manejar todos los servicios del reproductor. El mismo desarrollador puede agregarlo o modificarlo según sus necesidades.

Céntrate en este método, que es el método central de todo el negocio y controla la reproducción o pausa del vídeo. Los desarrolladores pueden llamar a este método cada vez que encuentren reproducción o pausa. Si se trata de reproducción o pausa, se determina internamente en función de la URL entrante.

Este método también se utiliza para cambiar a vídeos nuevos. La URL entrante no coincide con la anterior y el nuevo vídeo cambiará automáticamente. Los autores pueden monitorear los cambios en el estado de reproducción según statusListener para manejar su propia lógica.

Esto también hay que mencionarlo. Al reproducir un video nuevo, el reproductor de video se inicializará de forma asincrónica. Generalmente nuestra operación es inicializar en initState() y luego setState() después del éxito. Aquí, el autor encontró un problema doloroso:

Echemos un vistazo al uso de video_player:

Reproductor de video (controlador): el widget ya tiene un controlador. Originalmente, el propósito de la encapsulación del autor era desacoplar los widgets de los controladores. Pero el autor en este momento. . . .

No es imposible rendirse, ¡nunca me rendiré en esta vida!

Entonces el autor dio un paso inteligente y escribió un objeto inicializado, reemplazando dos parámetros: bool, widget, entre ellos, si la inicialización fue exitosa, el widget devuelve la interfaz de usuario del reproductor que se mostrará si la inicialización es exitosa; , y si falla, el valor predeterminado es const SizedBox().

Simplemente puedes usarlo aquí:

Leíste bien, la reproducción de video es así de simple.

Si hay muchas funciones comerciales, el autor también ha escrito un conjunto de acuerdo con sus propias necesidades, y los mismos desarrolladores también pueden agregarlas o modificarlas según sus propias necesidades.

VideoPlayerGestures maneja principalmente gestos, como avance rápido, rebobinado, etc. Deslice el lado izquierdo hacia arriba y hacia abajo para ajustar el brillo; deslice el lado derecho hacia arriba y hacia abajo para ajustar el volumen; haga clic para habilitar la reproducción inmersiva, ocultar y mostrar todos los widgets, hacer doble clic para reproducir, pausar, etc.

Oh, el PercentageWidget también se coloca debajo de este archivo, es esto:

Debido a que el porcentaje mostrado está relacionado con el gesto, se actualizará a medida que el gesto se mueva. Los desarrolladores pueden manejarlo ellos mismos.

En aras de la simplicidad, el autor los nombró según su ubicación en toda la interfaz de usuario. Sabrás lo que es de un vistazo.

El mismo desarrollador puede añadirlo o modificarlo según sus propias necesidades.

Ya está:

El mismo desarrollador puede añadirlo o modificarlo según sus necesidades. ¡Es realmente difícil saber si el ícono de este candado está abierto o cerrado!

Ya está:

El mismo desarrollador puede añadirlo o modificarlo según sus necesidades.

Esto es personalizado. No preguntes, si preguntas, pelearás con el producto.

Lo principal es personalizar esto:

Del mismo modo, los desarrolladores pueden personalizarlo según sus propias necesidades.

Nota: No hay ningún progreso en la adición de buffers aquí. Para el desarrollo, consulte el código fuente VideoProgressIndicator en video_player, que está definido por la empresa.

Esto es integrar los widgets anteriores y luego considerar el área segura de pantalla completa. ¡Los desarrolladores pueden manejarlo ellos mismos!

Consulte aquí para obtener ideas específicas sobre cómo implementar el oyente.

A partir de entonces terminó una bonita pelea. Si lo encuentra útil, ¡bienvenido a Star!