380 lines
8.3 KiB
ReStructuredText
380 lines
8.3 KiB
ReStructuredText
============
|
|
splash_video
|
|
============
|
|
|
|
A Flutter package for creating smooth video splash screens using media_kit. Provides seamless transitions from native splash screens to video playback with flexible overlay support and manual controls.
|
|
|
|
Features
|
|
========
|
|
|
|
- ✨ **Smooth Transitions** - Defer first frame pattern prevents jank between native and video splash
|
|
- 🎬 **Media Kit Integration** - Cross-platform video playback with hardware acceleration
|
|
- 🎮 **Manual Controls** - Full controller access for play, pause, skip operations
|
|
- 🔄 **Looping Support** - Infinite video loops with user-controlled exit
|
|
- 📱 **Flexible Overlays** - Title, footer, and custom overlay widgets
|
|
- 🎯 **Auto-Navigation** - Automatic screen transitions or manual control
|
|
- 🎨 **Customizable** - Aspect ratio, fullscreen, volume, and more
|
|
|
|
Installation
|
|
============
|
|
|
|
Add to your ``pubspec.yaml``:
|
|
|
|
.. code-block:: yaml
|
|
|
|
dependencies:
|
|
splash_video: ^0.0.1
|
|
media_kit: ^1.2.6
|
|
media_kit_video: ^2.0.1
|
|
|
|
# Platform-specific video libraries
|
|
media_kit_libs_android_video: any
|
|
media_kit_libs_ios_video: any
|
|
media_kit_libs_macos_video: any
|
|
media_kit_libs_windows_video: any
|
|
media_kit_libs_linux: any
|
|
|
|
Quick Start
|
|
===========
|
|
|
|
1. Initialize in main()
|
|
-----------------------
|
|
|
|
.. code-block:: dart
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:media_kit/media_kit.dart';
|
|
import 'package:splash_video/splash_video.dart';
|
|
|
|
void main() {
|
|
WidgetsFlutterBinding.ensureInitialized();
|
|
|
|
// Initialize SplashVideo (handles MediaKit and defers first frame)
|
|
SplashVideo.initialize();
|
|
|
|
runApp(MyApp());
|
|
}
|
|
|
|
2. Basic Usage (Auto-Navigate)
|
|
-------------------------------
|
|
|
|
.. code-block:: dart
|
|
|
|
class MyApp extends StatelessWidget {
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return MaterialApp(
|
|
home: SplashVideo(
|
|
source: AssetSource('assets/videos/splash.mp4'),
|
|
nextScreen: HomeScreen(),
|
|
backgroundColor: Colors.black,
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
Usage Examples
|
|
==============
|
|
|
|
Auto-Navigation
|
|
---------------
|
|
|
|
Video plays and automatically navigates to the next screen:
|
|
|
|
.. code-block:: dart
|
|
|
|
SplashVideo(
|
|
source: AssetSource('assets/videos/splash.mp4'),
|
|
nextScreen: HomeScreen(),
|
|
backgroundColor: Colors.black,
|
|
)
|
|
|
|
Manual Control
|
|
--------------
|
|
|
|
Use a callback for custom logic after video completes:
|
|
|
|
.. code-block:: dart
|
|
|
|
SplashVideo(
|
|
source: AssetSource('assets/videos/splash.mp4'),
|
|
onVideoComplete: () {
|
|
// Custom logic
|
|
Navigator.pushReplacement(
|
|
context,
|
|
MaterialPageRoute(builder: (_) => HomeScreen()),
|
|
);
|
|
},
|
|
)
|
|
|
|
Looping Video with Controller
|
|
------------------------------
|
|
|
|
Create an infinite loop that the user can manually exit:
|
|
|
|
.. code-block:: dart
|
|
|
|
class MyScreen extends StatefulWidget {
|
|
@override
|
|
State<MyScreen> createState() => _MyScreenState();
|
|
}
|
|
|
|
class _MyScreenState extends State<MyScreen> {
|
|
late final SplashVideoController controller;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
controller = SplashVideoController(loopVideo: true);
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
controller.dispose();
|
|
super.dispose();
|
|
}
|
|
|
|
void _onSkip() {
|
|
controller.skip();
|
|
Navigator.pushReplacement(
|
|
context,
|
|
MaterialPageRoute(builder: (_) => HomeScreen()),
|
|
);
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return SplashVideo(
|
|
source: AssetSource('assets/videos/splash.mp4'),
|
|
controller: controller,
|
|
footerWidget: ElevatedButton(
|
|
onPressed: _onSkip,
|
|
child: Text('Skip'),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
With Overlays
|
|
-------------
|
|
|
|
Add title, footer, and custom overlays:
|
|
|
|
.. code-block:: dart
|
|
|
|
SplashVideo(
|
|
source: AssetSource('assets/videos/splash.mp4'),
|
|
nextScreen: HomeScreen(),
|
|
backgroundColor: Colors.black,
|
|
|
|
// Title at top
|
|
titleWidget: Padding(
|
|
padding: EdgeInsets.all(20),
|
|
child: Text(
|
|
'Welcome',
|
|
style: TextStyle(fontSize: 32, color: Colors.white),
|
|
),
|
|
),
|
|
|
|
// Footer at bottom
|
|
footerWidget: CircularProgressIndicator(),
|
|
|
|
// Custom overlay with full control
|
|
overlayBuilder: (context) => Positioned(
|
|
right: 20,
|
|
top: 100,
|
|
child: Text('v1.0.0', style: TextStyle(color: Colors.white)),
|
|
),
|
|
)
|
|
|
|
Network Video
|
|
-------------
|
|
|
|
Load video from URL:
|
|
|
|
.. code-block:: dart
|
|
|
|
SplashVideo(
|
|
source: NetworkFileSource('https://example.com/splash.mp4'),
|
|
nextScreen: HomeScreen(),
|
|
)
|
|
|
|
Custom Configuration
|
|
--------------------
|
|
|
|
.. code-block:: dart
|
|
|
|
SplashVideo(
|
|
source: AssetSource('assets/videos/splash.mp4'),
|
|
nextScreen: HomeScreen(),
|
|
videoConfig: VideoConfig(
|
|
playImmediately: true,
|
|
videoVisibilityEnum: VisibilityEnum.useAspectRatio,
|
|
useSafeArea: true,
|
|
volume: 50.0,
|
|
onPlayerInitialized: (player) {
|
|
print('Player ready: ${player.state.duration}');
|
|
},
|
|
),
|
|
)
|
|
|
|
API Reference
|
|
=============
|
|
|
|
SplashVideo
|
|
-----------
|
|
|
|
Main widget for video splash screen.
|
|
|
|
.. list-table::
|
|
:header-rows: 1
|
|
:widths: 20 25 10 45
|
|
|
|
* - Parameter
|
|
- Type
|
|
- Required
|
|
- Description
|
|
* - ``source``
|
|
- ``Source``
|
|
- ✅
|
|
- Video source (Asset, Network, DeviceFile, Bytes)
|
|
* - ``controller``
|
|
- ``SplashVideoController?``
|
|
- ⚠️
|
|
- Required when looping is enabled
|
|
* - ``videoConfig``
|
|
- ``VideoConfig?``
|
|
- ❌
|
|
- Playback configuration
|
|
* - ``backgroundColor``
|
|
- ``Color?``
|
|
- ❌
|
|
- Background color behind video
|
|
* - ``titleWidget``
|
|
- ``Widget?``
|
|
- ❌
|
|
- Widget at top of screen
|
|
* - ``footerWidget``
|
|
- ``Widget?``
|
|
- ❌
|
|
- Widget at bottom of screen
|
|
* - ``overlayBuilder``
|
|
- ``Widget Function(BuildContext)?``
|
|
- ❌
|
|
- Custom overlay builder
|
|
* - ``nextScreen``
|
|
- ``Widget?``
|
|
- ❌
|
|
- Screen to navigate to (auto-navigate)
|
|
* - ``onVideoComplete``
|
|
- ``VoidCallback?``
|
|
- ❌
|
|
- Callback when video completes (manual control)
|
|
* - ``onSourceLoaded``
|
|
- ``VoidCallback?``
|
|
- ❌
|
|
- Callback when video loads
|
|
|
|
**Validation Rules:**
|
|
|
|
- Cannot use both ``nextScreen`` and ``onVideoComplete``
|
|
- Looping videos require ``controller`` and cannot use ``nextScreen`` or ``onVideoComplete``
|
|
|
|
SplashVideoController
|
|
---------------------
|
|
|
|
Controls video playback.
|
|
|
|
.. code-block:: dart
|
|
|
|
final controller = SplashVideoController(loopVideo: true);
|
|
|
|
// Access media_kit Player
|
|
controller.player.play();
|
|
controller.player.pause();
|
|
controller.player.seek(Duration(seconds: 5));
|
|
|
|
// Controller methods
|
|
controller.play();
|
|
controller.pause();
|
|
controller.skip(); // Complete immediately
|
|
controller.dispose();
|
|
|
|
VideoConfig
|
|
-----------
|
|
|
|
Configuration for video playback.
|
|
|
|
.. code-block:: dart
|
|
|
|
VideoConfig(
|
|
playImmediately: true, // Auto-play on load
|
|
videoVisibilityEnum: VisibilityEnum.useFullScreen, // Display mode
|
|
useSafeArea: false, // Wrap in SafeArea
|
|
volume: 100.0, // Volume (0-100)
|
|
onPlayerInitialized: (player) { }, // Player callback
|
|
)
|
|
|
|
Source Types
|
|
------------
|
|
|
|
.. code-block:: dart
|
|
|
|
// Asset bundled with app
|
|
AssetSource('assets/videos/splash.mp4')
|
|
|
|
// Network URL
|
|
NetworkFileSource('https://example.com/video.mp4')
|
|
|
|
// Device file
|
|
DeviceFileSource('/path/to/video.mp4')
|
|
|
|
// Raw bytes
|
|
BytesSource(videoBytes)
|
|
|
|
VisibilityEnum
|
|
--------------
|
|
|
|
.. code-block:: dart
|
|
|
|
VisibilityEnum.useFullScreen // Fill entire screen
|
|
VisibilityEnum.useAspectRatio // Maintain aspect ratio
|
|
VisibilityEnum.none // No special sizing
|
|
|
|
Lifecycle Methods
|
|
=================
|
|
|
|
.. code-block:: dart
|
|
|
|
// Defer first frame (prevents jank)
|
|
SplashVideo.initialize();
|
|
|
|
// Resume Flutter rendering
|
|
SplashVideo.resume();
|
|
|
|
Platform Support
|
|
================
|
|
|
|
.. list-table::
|
|
:header-rows: 1
|
|
|
|
* - Platform
|
|
- Supported
|
|
* - Android
|
|
- ✅
|
|
* - iOS
|
|
- ✅
|
|
* - macOS
|
|
- ✅
|
|
* - Windows
|
|
- ✅
|
|
* - Linux
|
|
- ✅
|
|
* - Web
|
|
- ✅
|
|
|
|
License
|
|
=======
|
|
|
|
MIT License - see LICENSE file for details.
|