Flutter 使用YouTube_player_iframe flatter观看YouTube视频
我想知道如何打开YouTube视频,并用视频播放器在我的Flitter应用程序上显示它,允许用户停止视频,向前、向后移动,只需在视频的底线上拖动手指。 我想使用Flutter 使用YouTube_player_iframe flatter观看YouTube视频,flutter,youtube-api,youtubeplayer,Flutter,Youtube Api,Youtubeplayer,我想知道如何打开YouTube视频,并用视频播放器在我的Flitter应用程序上显示它,允许用户停止视频,向前、向后移动,只需在视频的底线上拖动手指。 我想使用youtube\u player\u iframe,因为我在互联网上看到,这是唯一一个允许打开youtube视频的小部件(对于iOS,youtube\u player对于Android),所以我安装了它,并从中复制粘贴了示例并修复了一些错误 如果有人能帮助我理解为什么它不起作用,我将非常高兴 要安装,请从终端运行:flatterpub a
youtube\u player\u iframe
,因为我在互联网上看到,这是唯一一个允许打开youtube视频的小部件(对于iOS,youtube\u player
对于Android),所以我安装了它,并从中复制粘贴了示例并修复了一些错误
如果有人能帮助我理解为什么它不起作用,我将非常高兴
要安装,请从终端运行:flatterpub add youtube\u player\u iframe
或者只添加依赖项:youtube\u player\u iframe:^2.0.0
这是代码,只需复制粘贴即可运行:
import 'dart:developer';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:youtube_player_iframe/youtube_player_iframe.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
runApp(YoutubeApp());
}
///
class YoutubeApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Youtube Player IFrame Demo',
theme: ThemeData(
primarySwatch: Colors.deepPurple,
iconTheme: const IconThemeData(color: Colors.deepPurpleAccent),
),
debugShowCheckedModeBanner: false,
home: YoutubeAppDemo(),
);
}
}
///
class YoutubeAppDemo extends StatefulWidget {
@override
_YoutubeAppDemoState createState() => _YoutubeAppDemoState();
}
class _YoutubeAppDemoState extends State<YoutubeAppDemo> {
late YoutubePlayerController _controller;
String urlVideoFromYouTube = 'v0RWej7Sqg4'; //this is the last part of the YouTube url https://www.youtube.com/watch?v=v0RWej7Sqg4 copy-pasted by me
@override
void initState() {
super.initState();
_controller = YoutubePlayerController(
initialVideoId: urlVideoFromYouTube,
params: const YoutubePlayerParams(
playlist: [
'nPt8bK2gbaU',//Default playlist
'K18cpp_-gP8',
'iLnmTe5Q2Qw',
'_WoCV4c6XOE',
'KmzdUe0RSJo',
'6jZDSSZZxjQ',
'p2lYr3vM_1w',
'7QUtEmBT_-w',
'34_PXCzGw1M',
],
startAt: const Duration(minutes: 1, seconds: 36),
showControls: true,
showFullscreenButton: true,
desktopMode: true,
privacyEnhanced: true,
useHybridComposition: true,
),
);
_controller.onEnterFullscreen = () {
SystemChrome.setPreferredOrientations([
DeviceOrientation.landscapeLeft,
DeviceOrientation.landscapeRight,
]);
log('Entered Fullscreen');
};
_controller.onExitFullscreen = () {
log('Exited Fullscreen');
};
}
@override
Widget build(BuildContext context) {
const player = YoutubePlayerIFrame();
return YoutubePlayerControllerProvider(
// Passing controller to widgets below.
controller: _controller,
child: Scaffold(
appBar: AppBar(
title: const Text('Youtube Player IFrame'),
),
body: LayoutBuilder(
builder: (context, constraints) {
if (kIsWeb && constraints.maxWidth > 800) {
return Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Expanded(child: player),
const SizedBox(
width: 500,
child: SingleChildScrollView(
child: Controls(),
),
),
],
);
}
return ListView(
children: [
player,
const Controls(),
],
);
},
),
),
);
}
@override
void dispose() {
_controller.close();
super.dispose();
}
}
///
class Controls extends StatelessWidget {
///
const Controls();
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// _space,
// MetaDataSection(),
// _space,
// SourceInputSection(),
// _space,
// PlayPauseButtonBar(),
// _space,
// VolumeSlider(),
// _space,
// PlayerStateSection(),
],
),
);
}
Widget get _space => const SizedBox(height: 10);
}
导入“dart:developer”;
进口“包装:颤振/基础.dart”;
进口“包装:颤振/材料.省道”;
导入“包:flifter/services.dart”;
导入“包:youtube_player_iframe/youtube_player_iframe.dart”;
void main(){
WidgetsFlutterBinding.ensureInitialized();
runApp(YoutubeApp());
}
///
类YoutubeApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“Youtube播放器IFrame演示”,
主题:主题数据(
原色样本:颜色。深紫色,
iconTheme:const IconThemeData(颜色:Colors.deeppurpleacent),
),
debugShowCheckedModeBanner:false,
主页:youtubeapdemo(),
);
}
}
///
类YoutubeAppDemo扩展StatefulWidget{
@凌驾
_YoutubeAppDemoState createState()=>\u YoutubeAppDemoState();
}
类YoutubeAppDemoState扩展状态{
后期YoutubePlayerController\u控制器;
字符串urlVideoFromYouTube='v0RWej7Sqg4';//这是YouTube url的最后一部分https://www.youtube.com/watch?v=v0RWej7Sqg4 我粘贴的副本
@凌驾
void initState(){
super.initState();
_控制器=YoutubePlayerController(
initialVideoId:urlVideoFromYouTube,
参数:const YoutubePlayerParams(
播放列表:[
'nPt8bK2gbaU',//默认播放列表
“K18cpp_U8;-gP8”,
‘iLnmTe5Q2Qw’,
"WoCV4c6XOE",,
“KmzdUe0RSJo”,
“6JZDSZZXJQ”,
“p2lYr3vM_1w”,
“7QUtEmBT_uw”,
“34_PXCzGw1M”,
],
startAt:const持续时间(分钟:1秒:36),
showControls:对,
showFullscreenButton:正确,
desktopMode:true,
隐私:是的,
useHybridComposition:true,
),
);
_controller.onEnterFullscreen=(){
SystemChrome.setPreferredOrientations([
DeviceOrientation.landscapeLeft,
设备定向,景观权,
]);
日志(“进入全屏”);
};
_controller.onexit全屏=(){
日志(“退出全屏”);
};
}
@凌驾
小部件构建(构建上下文){
const player=YoutubePlayerIFrame();
返回YouTubePlayerController提供程序(
//将控制器传递给下面的小部件。
控制器:_控制器,
孩子:脚手架(
appBar:appBar(
标题:const Text(“Youtube播放器IFrame”),
),
正文:布局生成器(
生成器:(上下文、约束){
如果(kIsWeb&&constraints.maxWidth>800){
返回行(
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
常数扩展(子:玩家),
常量大小框(
宽度:500,
子:SingleChildScrollView(
子级:控件(),
),
),
],
);
}
返回列表视图(
儿童:[
玩家,
常量控件(),
],
);
},
),
),
);
}
@凌驾
无效处置(){
_controller.close();
super.dispose();
}
}
///
类控件扩展了无状态控件{
///
常量控件();
@凌驾
小部件构建(构建上下文){
返回填充(
填充:常量边集。全部(16),
子:列(
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
//_空间,
//MetaDataSection(),
//_空间,
//SourceInputSection(),
//_空间,
//PlayPauseButtonBar(),
//_空间,
//体积滑块(),
//_空间,
//PlayerStateSection(),
],
),
);
}
Widget get_space=>const SizedBox(高度:10);
}