Flutter嵌入YouTube视频播放插件youtube_player_embed的使用
Flutter嵌入YouTube视频播放插件youtube_player_embed的使用
简介
youtube_player_embed
是一个轻量级且可定制的Flutter包,允许开发者将YouTube视频(包括YouTube Shorts)直接嵌入到他们的Flutter应用程序中。通过这个包,您可以无缝集成视频,具有高级事件处理、自动播放、静音和纵横比自定义等功能。
功能特性
- 🎥 嵌入YouTube视频和Shorts:仅需少量配置即可轻松嵌入。
- 🔄 支持自动播放:实现即时视频播放。
- 🔇 静音选项:支持静音播放。
- 📱 响应式设计:支持横向(16:9)和纵向(9:16)视频。
- 💡 可定制化:移除YouTube品牌按钮以获得更简洁的UI。
- 🔗 直接Shorts集成:无缝嵌入垂直YouTube Shorts。
- ⏰ 高级事件监听器:更新视频状态、时间跟踪、seek事件和静音/取消静音检测。
- 🔑 增强控制:动态移除分享和品牌按钮。
- ⏯ 全屏支持:无缝进入和退出全屏。
- ⏹️ 播放控制:编程控制播放、暂停、seek、静音和取消静音。
- 🔍 自定义视频标题:动态设置或隐藏视频标题。
- 🚀 性能优化:轻量高效,提供更流畅的用户体验。
安装
在您的 pubspec.yaml
文件中添加以下依赖:
dependencies:
youtube_player_embed: ^1.6.4
运行以下命令安装该包:
flutter pub get
使用示例
示例代码
import 'package:flutter/material.dart';
import 'package:youtube_player_embed/youtube_player_embed.dart';
void main() => runApp(const MyApp());
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final List<String> listOfVideos = ["pUb9EW7F63s", "3vPbzEhF63s"];
String currentPlayingVideo = "";
VideoController? videoController;
@override
void initState() {
super.initState();
currentPlayingVideo = listOfVideos.removeAt(0);
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'YouTube Player Embed Demo',
home: Scaffold(
appBar: AppBar(
title: const Text('YouTube Player Example'),
),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
YoutubePlayerEmbed(
key: ValueKey(currentPlayingVideo),
callBackVideoController: (controller) {
videoController = controller;
},
videoId: currentPlayingVideo, // 替换为YouTube Shorts或普通视频ID
customVideoTitle: "بسم الله الرحمن الرحيم",
autoPlay: false,
hidenVideoControls: false,
mute: false,
enabledShareButton: false,
hidenChannelImage: true,
aspectRatio: 16 / 9,
onVideoEnd: () {
if (listOfVideos.isNotEmpty) {
setState(() {
currentPlayingVideo = listOfVideos.removeAt(0);
});
} else {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('No more videos to play!')),
);
}
},
onVideoSeek: (currentTime) => print("Seeked to $currentTime seconds"),
onVideoTimeUpdate: (currentTime) => print("Current time: $currentTime seconds"),
onVideoStateChange: (state) {
switch (state) {
case VideoState.playing:
print("Video is playing");
break;
case VideoState.paused:
print("Video is paused");
break;
case VideoState.muted:
print("Video is muted");
break;
case VideoState.unmuted:
print("Video is unmuted");
break;
case VideoState.fullscreen:
print("Video is in fullscreen");
break;
case VideoState.normalView:
print("Video is in normal view");
break;
}
},
),
const SizedBox(height: 100),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
ElevatedButton(
onPressed: () async {
await videoController?.playVideo();
},
child: const Text("Play"),
),
ElevatedButton(
onPressed: () async {
await videoController?.pauseVideo();
},
child: const Text("Pause"),
),
ElevatedButton(
onPressed: () async {
await videoController?.muteOrUnmuteVideo();
},
child: const Text("Mute / Unmute"),
),
],
),
const SizedBox(height: 50),
ElevatedButton(
onPressed: () async {
await videoController?.seekTo(time: 4);
},
child: const Text("Seek to 4 seconds (for test)"),
),
],
),
),
);
}
}
API 参考
属性 | 类型 | 默认值 | 描述 |
---|---|---|---|
videoId |
String |
必填 | 要嵌入的YouTube视频ID |
aspectRatio |
double |
null |
视频的纵横比 |
enabledShareButton |
bool |
false |
是否启用分享按钮 |
autoPlay |
bool |
true |
视频加载时是否自动播放 |
mute |
bool |
false |
视频默认是否静音 |
onVideoEnd |
VoidCallback? |
null |
视频结束时触发的回调 |
onVideoSeek |
Function(double)? |
null |
seek操作发生时触发的回调 |
onVideoTimeUpdate |
Function(double)? |
null |
视频时间更新时触发的回调 |
onVideoStateChange |
Function(VideoState)? |
null |
视频状态变化(播放/暂停等)时触发的回调 |
customVideoTitle |
String? |
null |
自定义视频标题 |
hidenVideoControls |
bool |
false |
是否隐藏视频控件 |
hidenChannelImage |
bool |
true |
是否隐藏频道图片 |
支持平台
- ✅ Android
- ✅ iOS
- ✅ Web (有局限性)
- ✅ Desktop
设置
Android 设置
确保在 AndroidManifest.xml
中添加以下权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
iOS 设置
-
更新
Info.plist
在
Info.plist
文件中添加以下权限:<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> <key>io.flutter.embedded_views_preview</key> <true/>
-
编辑 Podfile
如果遇到问题,请在 iOS
Podfile
中添加以下内容:target 'Runner' do use_frameworks! # required by flutter_inappwebview ... end post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['SWIFT_VERSION'] = '5.0' # required by flutter_inappwebview config.build_settings['ENABLE_BITCODE'] = 'NO' end end end
更多信息
如果您有任何问题或建议,欢迎提交Issue或Pull Request。
更多关于Flutter嵌入YouTube视频播放插件youtube_player_embed的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter嵌入YouTube视频播放插件youtube_player_embed的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中嵌入YouTube视频播放插件 youtube_player_embed
的详细代码案例。
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 youtube_player_embed
依赖。
dependencies:
flutter:
sdk: flutter
youtube_player_embed: ^0.1.4 # 请注意版本号,确保使用最新版本
2. 导入包
在你的 Dart 文件中导入 youtube_player_embed
包。
import 'package:youtube_player_embed/youtube_player_embed.dart';
3. 创建 YouTubePlayerEmbed 小部件
接下来,你可以在你的 Flutter 应用中使用 YoutubePlayerEmbed
小部件来嵌入 YouTube 视频。
import 'package:flutter/material.dart';
import 'package:youtube_player_embed/youtube_player_embed.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('YouTube Player Embed Example'),
),
body: Center(
child: YouTubePlayerEmbed(
videoId: 'dQw4w9WgXcQ', // 在这里替换成你想要的 YouTube 视频 ID
showFullscreenButton: true,
showRelatedVideos: false,
showControls: true,
autoPlay: false,
),
),
),
);
}
}
4. 运行应用
现在,你可以运行你的 Flutter 应用,并看到一个嵌入的 YouTube 视频播放器。
5. 自定义参数
YoutubePlayerEmbed
小部件提供了多个参数供你自定义播放器的行为:
videoId
: YouTube 视频的唯一标识符。showFullscreenButton
: 是否显示全屏按钮。showRelatedVideos
: 视频播放结束后是否显示相关视频。showControls
: 是否显示播放控制。autoPlay
: 视频是否自动播放。
完整示例
以下是一个更完整的示例,包含了一些基本的布局和样式:
import 'package:flutter/material.dart';
import 'package:youtube_player_embed/youtube_player_embed.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('YouTube Player Embed Example'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Embedded YouTube Video:',
style: TextStyle(fontSize: 24),
),
SizedBox(height: 16),
AspectRatio(
aspectRatio: 16 / 9,
child: YouTubePlayerEmbed(
videoId: 'dQw4w9WgXcQ', // 在这里替换成你想要的 YouTube 视频 ID
showFullscreenButton: true,
showRelatedVideos: false,
showControls: true,
autoPlay: false,
),
),
],
),
),
),
);
}
}
这个示例使用了 AspectRatio
来确保播放器保持正确的宽高比,并且添加了一些文本和间距来美化布局。
希望这些代码案例能帮助你在 Flutter 项目中成功嵌入 YouTube 视频播放插件 youtube_player_embed
。