// Importa bibliotecas import 'dart:async'; import 'package:flutter/material.dart'; import 'package:video_player/video_player.dart'; void main() => runApp(VideoPlayerApp()); class VideoPlayerApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Video Player Demo', home: VideoPlayerScreen(), ); } } class VideoPlayerScreen extends StatefulWidget { VideoPlayerScreen({Key key}) : super(key: key); @override _VideoPlayerScreenState createState() => _VideoPlayerScreenState(); } class _VideoPlayerScreenState extends State { VideoPlayerController _controller; Future _initializeVideoPlayerFuture; @override void initState() { // Aqui estou exibindo um vídeo como asset (o vídeo está nas pastas do // projeto do app, ao instalar o vídeo vai junto). Coloquei o vídeo na pasta // "video". _controller = VideoPlayerController.asset( 'video/terra.mp4', ); // Inicializa o controlador. _initializeVideoPlayerFuture = _controller.initialize(); // Configura o vídeo para exibir em loop. _controller.setLooping(true); super.initState(); } @override void dispose() { // Libera recursos do controlador de vídeo. _controller.dispose(); super.dispose(); } // Constroi layout. @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Butterfly Video'), ), // Usa um FutureBuilder para exibir o spinner, indicando que o vídeo // está sendo carregado. body: FutureBuilder( future: _initializeVideoPlayerFuture, builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.done) { // Se o controlador terminou a inicialização, usa os dados do vídeo // para definir o aspect radio (4:3 ou 16:9). return AspectRatio( aspectRatio: _controller.value.aspectRatio, // Chama o player para exibir no layout. child: VideoPlayer(_controller), ); } else { // Se o contrrolador ainda está carregando, mostra o spinner. return Center(child: CircularProgressIndicator()); } }, ), floatingActionButton: FloatingActionButton( onPressed: () { // Controla o play/pause do vídeo. setState(() { // Se o vídeo está executado, pausa. if (_controller.value.isPlaying) { _controller.pause(); } else { // Se o vídeo está pausado, continua a execução. _controller.play(); } }); }, // Exibie o ícone correto de acordo com a situação atual (play ou pause). child: Icon( _controller.value.isPlaying ? Icons.pause : Icons.play_arrow, ), ), ); } }