simple_youtube_player 0.1.1 copy "simple_youtube_player: ^0.1.1" to clipboard
simple_youtube_player: ^0.1.1 copied to clipboard

A simple and easy-to-use YouTube video player widget for Flutter. Just provide a URL and size, and you're ready to go! Supports all YouTube URL formats with auto-play, mute, loop, and control options.

🎥 Simple YouTube Player #

The easiest way to embed YouTube videos in Flutter #

pub package likes popularity pub points

A beautifully simple, lightweight, and powerful YouTube video player for Flutter. Just provide a URL and dimensions - that's it! No complex setup, no boilerplate code, just pure simplicity.

✨ NEW in v0.1.1: Critical bug fixes - Now works on all platforms! 🎉

Getting Started • Examples • Documentation • Changelog


📢 What's New in v0.1.1 #

🐛 Critical Bug Fix: Fixed WebView platform implementation issue
✅ Now Production Ready: Works perfectly on Android, iOS, Web, and Desktop
🚀 Better Platform Support: Improved initialization for all platforms

See full changelog →


✨ Why Simple YouTube Player? #

🎯 Zero Configuration - Works out of the box with sensible defaults
🚀 Lightweight - Minimal dependencies, maximum performance
🎨 Customizable - Full control over size, autoplay, controls, and more
🔗 Flexible URLs - Supports all YouTube URL formats automatically
📱 Responsive - Perfect for any screen size
🎮 Controller Support - Advanced control when you need it
⚡ Fast Loading - Optimized for quick video loading
🛡️ Error Handling - Graceful error messages built-in
🌍 Cross-Platform - Works on iOS, Android, Web, and Desktop
✅ Production Ready - v0.1.1 is stable and tested


📦 Installation #

Add simple_youtube_player to your pubspec.yaml:

dependencies:
  simple_youtube_player: ^0.1.1

Then install it:

flutter pub get

That's it! You're ready to go 🎉


🚀 Quick Start #

The simplest possible usage:

import 'package:flutter/material.dart';
import 'package:simple_youtube_player/simple_youtube_player.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Simple YouTube Player')),
        body: Center(
          child: SimpleYoutubePlayer(
            url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
            width: 350,
            height: 220,
          ),
        ),
      ),
    );
  }
}

That's literally all you need! 🎊


💡 Usage Examples #

🎬 Basic Video Player #

Perfect for simple video embedding:

SimpleYoutubePlayer(
  url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
  width: 300,
  height: 200,
)

⚙️ Customized Player #

Full control over player behavior:

SimpleYoutubePlayer(
  url: 'https://youtu.be/jNQXAC9IVRw',
  width: 400,
  height: 250,
  autoPlay: true,        // Start playing automatically
  mute: true,            // Start muted (recommended with autoPlay)
  loop: true,            // Loop the video infinitely
  showControls: true,    // Show YouTube player controls
)

🎮 With Controller #

For advanced control and state monitoring:

import 'package:flutter/material.dart';
import 'package:simple_youtube_player/simple_youtube_player.dart';

class AdvancedPlayerScreen extends StatefulWidget {
  @override
  _AdvancedPlayerScreenState createState() => _AdvancedPlayerScreenState();
}

class _AdvancedPlayerScreenState extends State<AdvancedPlayerScreen> {
  final _controller = SimpleYoutubePlayerController();

  @override
  void initState() {
    super.initState();
    
    // Monitor player state changes
    _controller.addListener(() {
      setState(() {}); // Rebuild UI when state changes
      
      if (_controller.error != null) {
        print('Error: ${_controller.error}');
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Advanced Player')),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          SimpleYoutubePlayer(
            url: 'https://www.youtube.com/watch?v=VIDEO_ID',
            width: 350,
            height: 220,
            controller: _controller,
          ),
          SizedBox(height: 20),
          // Show loading indicator
          if (_controller.isLoading)
            CircularProgressIndicator(),
          // Show error if any
          if (_controller.error != null)
            Text(
              'Error: ${_controller.error}',
              style: TextStyle(color: Colors.red),
            ),
        ],
      ),
    );
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }
}

📱 Responsive Player #

Adapts to any screen size with perfect aspect ratio:

import 'package:flutter/material.dart';
import 'package:simple_youtube_player/simple_youtube_player.dart';

class ResponsivePlayerScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Responsive Player')),
      body: Center(
        child: LayoutBuilder(
          builder: (context, constraints) {
            // Calculate responsive dimensions
            double width = constraints.maxWidth * 0.9;
            double height = width * 9 / 16; // 16:9 aspect ratio
            
            return SimpleYoutubePlayer(
              url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
              width: width,
              height: height,
            );
          },
        ),
      ),
    );
  }
}

📜 Video List #

Display multiple videos in a scrollable list:

import 'package:flutter/material.dart';
import 'package:simple_youtube_player/simple_youtube_player.dart';

class VideoListScreen extends StatelessWidget {
  final List<Map<String, String>> videos = [
    {
      'title': 'Amazing Video 1',
      'url': 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
    },
    {
      'title': 'Cool Tutorial',
      'url': 'https://youtu.be/jNQXAC9IVRw',
    },
    {
      'title': 'Must Watch',
      'url': 'https://www.youtube.com/watch?v=9bZkp7q19f0',
    },
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Video Playlist')),
      body: ListView.builder(
        padding: EdgeInsets.all(16),
        itemCount: videos.length,
        itemBuilder: (context, index) {
          return Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text(
                videos[index]['title']!,
                style: TextStyle(
                  fontSize: 18,
                  fontWeight: FontWeight.bold,
                ),
              ),
              SizedBox(height: 8),
              SimpleYoutubePlayer(
                url: videos[index]['url']!,
                width: MediaQuery.of(context).size.width - 32,
                height: 200,
              ),
              SizedBox(height: 24),
            ],
          );
        },
      ),
    );
  }
}

🎨 Styled Player #

Add beautiful styling around your player:

import 'package:flutter/material.dart';
import 'package:simple_youtube_player/simple_youtube_player.dart';

class StyledPlayerScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.grey[900],
      appBar: AppBar(
        title: Text('Styled Player'),
        backgroundColor: Colors.black,
      ),
      body: Center(
        child: Container(
          margin: EdgeInsets.all(16),
          decoration: BoxDecoration(
            color: Colors.black,
            borderRadius: BorderRadius.circular(16),
            boxShadow: [
              BoxShadow(
                color: Colors.blue.withOpacity(0.3),
                blurRadius: 20,
                spreadRadius: 5,
                offset: Offset(0, 10),
              ),
            ],
          ),
          padding: EdgeInsets.all(8),
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              SimpleYoutubePlayer(
                url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
                width: 350,
                height: 220,
              ),
              SizedBox(height: 16),
              Text(
                'Featured Video',
                style: TextStyle(
                  color: Colors.white,
                  fontSize: 20,
                  fontWeight: FontWeight.bold,
                ),
              ),
              SizedBox(height: 8),
              Text(
                'Watch this amazing content',
                style: TextStyle(
                  color: Colors.grey[400],
                  fontSize: 14,
                ),
              ),
              SizedBox(height: 8),
            ],
          ),
        ),
      ),
    );
  }
}

🎭 Background Video #

Full-screen background video effect:

import 'package:flutter/material.dart';
import 'package:simple_youtube_player/simple_youtube_player.dart';

class BackgroundVideoScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        children: [
          // Background video
          Positioned.fill(
            child: SimpleYoutubePlayer(
              url: 'https://www.youtube.com/watch?v=VIDEO_ID',
              width: MediaQuery.of(context).size.width,
              height: MediaQuery.of(context).size.height,
              autoPlay: true,
              mute: true,
              loop: true,
              showControls: false,
            ),
          ),
          // Overlay content
          Positioned.fill(
            child: Container(
              color: Colors.black.withOpacity(0.5),
              child: Center(
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Text(
                      'Welcome',
                      style: TextStyle(
                        color: Colors.white,
                        fontSize: 48,
                        fontWeight: FontWeight.bold,
                      ),
                    ),
                    SizedBox(height: 16),
                    ElevatedButton(
                      onPressed: () {},
                      child: Text('Get Started'),
                    ),
                  ],
                ),
              ),
            ),
          ),
        ],
      ),
    );
  }
}

🔗 Supported URL Formats #

The package automatically recognizes all YouTube URL formats:

Format Example ✅ Supported
Standard https://www.youtube.com/watch?v=VIDEO_ID ✅
Short https://youtu.be/VIDEO_ID ✅
Embed https://www.youtube.com/embed/VIDEO_ID ✅
Mobile https://m.youtube.com/watch?v=VIDEO_ID ✅
Direct ID VIDEO_ID (11 characters) ✅

Just paste any YouTube URL and it works! 🎯


📋 Parameters #

Complete reference of all available parameters:

Parameter Type Default Required Description
url String - ✅ YouTube video URL or video ID
width double 300.0 ❌ Player width in logical pixels
height double 200.0 ❌ Player height in logical pixels
autoPlay bool false ❌ Auto-start video playback on load
mute bool false ❌ Start video with audio muted
loop bool false ❌ Loop video playback infinitely
showControls bool true ❌ Display YouTube player controls
controller SimpleYoutubePlayerController? null ❌ Controller for advanced features

🎮 Controller API #

For advanced control and monitoring, use SimpleYoutubePlayerController:

Properties #

final controller = SimpleYoutubePlayerController();

// Check player state
bool isPlaying = controller.isPlaying;    // Is video currently playing?
bool isLoading = controller.isLoading;    // Is video still loading?
String? error = controller.error;         // Error message if any

Methods #

// Listen to state changes
controller.addListener(() {
  print('Player state changed!');
  print('Loading: ${controller.isLoading}');
  print('Error: ${controller.error}');
});

// Don't forget to dispose!
controller.dispose();

🌟 Best Practices #

✅ DO: #

// Use mute with autoPlay for better UX
SimpleYoutubePlayer(
  url: 'https://youtube.com/watch?v=...',
  autoPlay: true,
  mute: true,  // ✅ Good practice
)

// Dispose controllers
@override
void dispose() {
  _controller.dispose();  // ✅ Prevents memory leaks
  super.dispose();
}

// Handle errors gracefully
controller.addListener(() {
  if (controller.error != null) {
    // Show user-friendly message
  }
});

❌ DON'T: #

// Don't autoplay with sound (annoying for users)
SimpleYoutubePlayer(
  autoPlay: true,
  mute: false,  // ❌ Bad UX
)

// Don't forget controller cleanup
// ❌ Memory leak!

// Don't use extremely large dimensions
SimpleYoutubePlayer(
  width: 10000,  // ❌ Performance issue
  height: 10000,
)

🎨 Customization Tips #

Perfect 16:9 Aspect Ratio #

double width = 400;
double height = width * 9 / 16;  // = 225

SimpleYoutubePlayer(
  url: url,
  width: width,
  height: height,
)

Dynamic Sizing Based on Screen #

double screenWidth = MediaQuery.of(context).size.width;
double playerWidth = screenWidth * 0.9;  // 90% of screen
double playerHeight = playerWidth * 9 / 16;

Card-Style Player #

Card(
  elevation: 8,
  shape: RoundedRectangleBorder(
    borderRadius: BorderRadius.circular(12),
  ),
  child: ClipRRect(
    borderRadius: BorderRadius.circular(12),
    child: SimpleYoutubePlayer(
      url: url,
      width: 300,
      height: 200,
    ),
  ),
)

🌍 Platform Support #

Platform Supported Notes
🤖 Android ✅ Full support (Fixed in v0.1.1)
🍎 iOS ✅ Full support (Fixed in v0.1.1)
🌐 Web ✅ Full support
💻 macOS ✅ Full support
🪟 Windows ✅ Full support
🐧 Linux ✅ Full support

⚠️ Important Notes #

  • 📡 Internet Required: Videos require active internet connection
  • 🔒 Embed Restrictions: Some videos may have embedding disabled by uploader
  • 🎬 YouTube Terms: Respects YouTube's Terms of Service
  • 🔄 WebView Based: Uses webview_flutter internally for reliability

🐛 Troubleshooting #

Video Not Loading? #

  1. Check URL: Ensure the URL is valid and video exists
  2. Check Internet: Verify internet connection is active
  3. Check Embedding: Some videos can't be embedded (error will show)
  4. Update Package: Make sure you're using v0.1.1 or higher

Still Using v0.0.1? #

⚠️ Version 0.0.1 has a critical bug! Please upgrade to v0.1.1:

# Update pubspec.yaml
dependencies:
  simple_youtube_player: ^0.1.1

# Get update
flutter pub get

📱 Live Demo #

Check out the /example folder for a complete demo app featuring:

  • Basic player usage
  • Advanced controller features
  • Responsive layouts
  • Multiple videos in list
  • Styled player examples
  • All configuration options

Run the example:

cd example
flutter run

🤝 Contributing #

Contributions are welcome! Here's how you can help:

  1. 🐛 Report Bugs: Open an issue with reproduction steps
  2. 💡 Suggest Features: Share your ideas in issues
  3. 🔧 Submit PRs: Fork, code, and submit pull requests
  4. 📖 Improve Docs: Help make documentation better
  5. ⭐ Star the Repo: Show your support!

See CONTRIBUTING.md for detailed guidelines.


📄 License #

This project is licensed under the MIT License - see the LICENSE file for details.

TL;DR: Free to use, modify, and distribute. Commercial use allowed. 🎉


🙏 Credits #

  • Built with ❤️ for the Flutter community
  • Powered by webview_flutter
  • Inspired by the need for simplicity in video embedding

💬 Support & Feedback #


5
likes
110
points
20
downloads

Documentation

Documentation
API reference

Publisher

unverified uploader

Weekly Downloads

A simple and easy-to-use YouTube video player widget for Flutter. Just provide a URL and size, and you're ready to go! Supports all YouTube URL formats with auto-play, mute, loop, and control options.

Repository (GitHub)
View/report issues

Topics

#youtube #video #player #widget #embed

License

unknown (license)

Dependencies

flutter, webview_flutter, webview_flutter_android, webview_flutter_wkwebview

More

Packages that depend on simple_youtube_player