рдореЗрд░реЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдмрд╕ рдлрд╝реБрд▓рд╕реНрдХреНрд░реАрди рдЪреАрдЬрд╝ред рдпрд╣ рд╕рд┐рд░реНрдл рдРрдк рдХреЗ рдУрд░рд┐рдПрдВрдЯреЗрд╢рди рдХреЛ рдШреБрдорд╛ рд░рд╣рд╛ рд╣реИред рдЕрдЧрд░ рдореИрдВ рдкреВрд░реНрдг рд╕реНрдХреНрд░реАрди рд╕реЗ рд╡рд╛рдкрд╕ рдЬрд╛рддрд╛ рд╣реВрдВ, рддреЛ рдРрдк рдУрд░рд┐рдПрдВрдЯреЗрд╢рди рд▓реИрдВрдбрд╕реНрдХреЗрдк рд╣реИ рдЬрд┐рд╕рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИред рдЬрдм рд╣рдо рдкреВрд░реНрдг рд╕реНрдХреНрд░реАрди рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ рднреА рд╕рднреА рд╡рд┐рдЬреЗрдЯ рдРрдкрдмрд╛рд░ рдФрд░ рдЕрдиреНрдп рд╡рд┐рдЬреЗрдЯ рдХреА рддрд░рд╣ рдЫрд┐рдкреЗ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред
_controller.value.isFullScreen
рдПрдХ рдЕрдВрддрд┐рдо рдореВрд▓реНрдп рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдкреВрд░реНрдг рд╕реНрдХреНрд░реАрди рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рдЬреЗрдЯреНрд╕ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдпрд╛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реВрдВред
рд╣рд╛рдп @ рдкреНрд░рд┐рдВрд╕рдЯреЗрдХред рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рдереА рдФрд░ рдЬрдм рд╣рдо рдлреБрд▓рд╕реНрдХреНрд░реАрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ, рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдПрдХ рдмреВрд▓рд┐рдпрди рд╡реИрд░рд┐рдПрдмрд▓ рдЬреЛрдбрд╝рдХрд░ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛, рдЗрд╕рд▓рд┐рдП рдЬрдм рд╣рдо рдлреБрд▓рд╕реНрдХреНрд░реАрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реЛрдВ рддреЛ рдореИрдВ рдРрдкрдмрд╛рд░ рдХреЛ рд╢реВрдиреНрдп рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реВрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рдлреБрд▓рд╕реНрдХреНрд░реАрди рдлреБрд▓рд╕реНрдХреНрд░реАрди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмреИрдХ рдмрдЯрди рдкреНрд░реЗрд╕ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рд╡рд┐рд▓рдкреЙрдкрд╕реНрдХреЛрдк рд╡рд┐рдЬреЗрдЯ рдЬреЛрдбрд╝рд╛ред рдпрд╣рд╛рдБ рдореЗрд░реА рдЕрдВрддрд┐рдо рдлрд╝рд╛рдЗрд▓ рд╣реИред рдореБрдЭреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд▓рд╛рдЗрд╡ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред
class LiveDetail extends StatefulWidget {
final Live live;
LiveDetail({
Key key,
<strong i="8">@required</strong> this.live,
}) : super(key: key);
<strong i="9">@override</strong>
_LiveDetailState createState() => _LiveDetailState();
}
class _LiveDetailState extends State<LiveDetail> {
YoutubePlayerController _controller;
bool showAppBar = true;
<strong i="10">@override</strong>
void initState() {
_controller = YoutubePlayerController(
initialVideoId: widget.live.videoId,
flags: YoutubePlayerFlags(autoPlay: true, isLive: widget.live.isLive, controlsVisibleAtStart: true),
);
super.initState();
}
Future<bool> _onWillPop() {
if (_controller.value.isFullScreen) {
_controller.toggleFullScreenMode();
} else {
Navigator.pop(context);
}
}
<strong i="11">@override</strong>
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: _onWillPop,
child: MaterialApp(
title: 'Live',
theme: ThemeData(primaryColor: Color(CustomColors.grena)),
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: showAppBar
? AppBar(
title: Text(widget.live.title),
leading: new IconButton(
icon: new Icon(Icons.arrow_back),
onPressed: () {
Navigator.pop(context);
},
),
)
: null,
body: Container(
child: YoutubePlayerBuilder(
player: YoutubePlayer(controller: _controller),
builder: (context, player) {
return Column(
children: <Widget>[player],
);
},
onEnterFullScreen: () {
setState(() {
showAppBar = false;
});
},
onExitFullScreen: () {
setState(() {
showAppBar = true;
});
},
),
)),
),
);
}
}
рдмрд╕ рдЕрдкрдиреЗ рдордЪрд╛рди рдХреЛ YoutubePlayerBuilder
рдХреЗ рдиреАрдЪреЗ рд░рдЦреЗрдВ
рдмрд╕ рдЕрдкрдиреЗ рдордЪрд╛рди рдХреЛ
YoutubePlayerBuilder
рдХреЗ рдиреАрдЪреЗ рд░рдЦреЗрдВ
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдм рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рдЬрд┐рд╕рдХрд╛ рдореИрдВ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рд▓рд╛рдЗрд╡ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдкрд░ рд╡реАрдбрд┐рдпреЛ рдХреНрд░реЙрдк рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЖрдИрдУрдПрд╕ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдкрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реВ рдЕрдиреБрдкрд╛рдд рдЦрд░рд╛рдм рд╣реЛ рдЧрдпрд╛ рд╣реИред
рд╣рд╛рдп @ рдкреНрд░рд┐рдВрд╕рдЯреЗрдХред рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рдереА рдФрд░ рдЬрдм рд╣рдо рдлреБрд▓рд╕реНрдХреНрд░реАрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ, рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдПрдХ рдмреВрд▓рд┐рдпрди рд╡реИрд░рд┐рдПрдмрд▓ рдЬреЛрдбрд╝рдХрд░ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛, рдЗрд╕рд▓рд┐рдП рдЬрдм рд╣рдо рдлреБрд▓рд╕реНрдХреНрд░реАрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реЛрдВ рддреЛ рдореИрдВ рдРрдкрдмрд╛рд░ рдХреЛ рд╢реВрдиреНрдп рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реВрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рдлреБрд▓рд╕реНрдХреНрд░реАрди рдлреБрд▓рд╕реНрдХреНрд░реАрди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмреИрдХ рдмрдЯрди рдкреНрд░реЗрд╕ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рд╡рд┐рд▓рдкреЙрдкрд╕реНрдХреЛрдк рд╡рд┐рдЬреЗрдЯ рдЬреЛрдбрд╝рд╛ред рдпрд╣рд╛рдБ рдореЗрд░реА рдЕрдВрддрд┐рдо рдлрд╝рд╛рдЗрд▓ рд╣реИред рдореБрдЭреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд▓рд╛рдЗрд╡ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред
class LiveDetail extends StatefulWidget { final Live live; LiveDetail({ Key key, <strong i="9">@required</strong> this.live, }) : super(key: key); <strong i="10">@override</strong> _LiveDetailState createState() => _LiveDetailState(); } class _LiveDetailState extends State<LiveDetail> { YoutubePlayerController _controller; bool showAppBar = true; <strong i="11">@override</strong> void initState() { _controller = YoutubePlayerController( initialVideoId: widget.live.videoId, flags: YoutubePlayerFlags(autoPlay: true, isLive: widget.live.isLive, controlsVisibleAtStart: true), ); super.initState(); } Future<bool> _onWillPop() { if (_controller.value.isFullScreen) { _controller.toggleFullScreenMode(); } else { Navigator.pop(context); } } <strong i="12">@override</strong> Widget build(BuildContext context) { return WillPopScope( onWillPop: _onWillPop, child: MaterialApp( title: 'Live', theme: ThemeData(primaryColor: Color(CustomColors.grena)), debugShowCheckedModeBanner: false, home: Scaffold( appBar: showAppBar ? AppBar( title: Text(widget.live.title), leading: new IconButton( icon: new Icon(Icons.arrow_back), onPressed: () { Navigator.pop(context); }, ), ) : null, body: Container( child: YoutubePlayerBuilder( player: YoutubePlayer(controller: _controller), builder: (context, player) { return Column( children: <Widget>[player], ); }, onEnterFullScreen: () { setState(() { showAppBar = false; }); }, onExitFullScreen: () { setState(() { showAppBar = true; }); }, ), )), ), ); } }
рд▓реЗрдХрд┐рди рд╕реЗрдЯрд╕реНрдЯреЗрдЯ рд╡рд┐рдЬреЗрдЯ рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдЧрд╛, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╡реАрдбрд┐рдпреЛ рдмрд╛рд░-рдмрд╛рд░ рдкреБрдирд░рд╛рд░рдВрдн рд╣реЛрдЧрд╛ рдЬрдм рдПрдВрдЯрд░рдлреБрд▓рд╕реНрдХреНрд░реАрди рдФрд░ рдСрдирдПрдХреНрд╕рд┐рдЯрдлреБрд▓рд╕реНрдХреНрд░реАрди рдХреЙрд▓рдмреИрдХ рдЯреНрд░рд┐рдЧрд░ рд╣реЛрдЧрд╛
рдмрд╕ рдЕрдкрдиреЗ рдордЪрд╛рди рдХреЛ
YoutubePlayerBuilder
рдХреЗ рдиреАрдЪреЗ рд░рдЦреЗрдВ
рдореБрдЭреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдФрд░ рдореБрдЭреЗ @princeteck рдЬреИрд╕рд╛ рд╣реА рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рд╛ред рд╡реАрдбрд┐рдпреЛ рдХреНрд░реЙрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд╕рднреА рдХреИрдкреНрд╢рди рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣реЗ рд╣реИрдВред
рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ :)
рд╕рдорд╕реНрдпрд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛ рд░рд╣реА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдлреБрд▓рд╕реНрдХреНрд░реАрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдкреНрд▓рдЧрдЗрди рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдкреНрд▓реЗрдпрд░ рд╣реИред рдореИрдВ рдореИрдиреНрдпреБрдЕрд▓ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЛ рд╣рдЯрд╛рдХрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рдЙрдкрд╛рдп :-
рд╣рд╛рдп @ рдкреНрд░рд┐рдВрд╕рдЯреЗрдХред рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рдереА рдФрд░ рдЬрдм рд╣рдо рдлреБрд▓рд╕реНрдХреНрд░реАрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ, рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдПрдХ рдмреВрд▓рд┐рдпрди рд╡реИрд░рд┐рдПрдмрд▓ рдЬреЛрдбрд╝рдХрд░ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛, рдЗрд╕рд▓рд┐рдП рдЬрдм рд╣рдо рдлреБрд▓рд╕реНрдХреНрд░реАрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реЛрдВ рддреЛ рдореИрдВ рдРрдкрдмрд╛рд░ рдХреЛ рд╢реВрдиреНрдп рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реВрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рдлреБрд▓рд╕реНрдХреНрд░реАрди рдлреБрд▓рд╕реНрдХреНрд░реАрди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмреИрдХ рдмрдЯрди рдкреНрд░реЗрд╕ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рд╡рд┐рд▓рдкреЙрдкрд╕реНрдХреЛрдк рд╡рд┐рдЬреЗрдЯ рдЬреЛрдбрд╝рд╛ред рдпрд╣рд╛рдБ рдореЗрд░реА рдЕрдВрддрд┐рдо рдлрд╝рд╛рдЗрд▓ рд╣реИред рдореБрдЭреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд▓рд╛рдЗрд╡ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред
class LiveDetail extends StatefulWidget { final Live live; LiveDetail({ Key key, <strong i="9">@required</strong> this.live, }) : super(key: key); <strong i="10">@override</strong> _LiveDetailState createState() => _LiveDetailState(); } class _LiveDetailState extends State<LiveDetail> { YoutubePlayerController _controller; bool showAppBar = true; <strong i="11">@override</strong> void initState() { _controller = YoutubePlayerController( initialVideoId: widget.live.videoId, flags: YoutubePlayerFlags(autoPlay: true, isLive: widget.live.isLive, controlsVisibleAtStart: true), ); super.initState(); } Future<bool> _onWillPop() { if (_controller.value.isFullScreen) { _controller.toggleFullScreenMode(); } else { Navigator.pop(context); } } <strong i="12">@override</strong> Widget build(BuildContext context) { return WillPopScope( onWillPop: _onWillPop, child: MaterialApp( title: 'Live', theme: ThemeData(primaryColor: Color(CustomColors.grena)), debugShowCheckedModeBanner: false, home: Scaffold( appBar: showAppBar ? AppBar( title: Text(widget.live.title), leading: new IconButton( icon: new Icon(Icons.arrow_back), onPressed: () { Navigator.pop(context); }, ), ) : null, body: Container( child: YoutubePlayerBuilder( player: YoutubePlayer(controller: _controller), builder: (context, player) { return Column( children: <Widget>[player], ); }, onEnterFullScreen: () { setState(() { showAppBar = false; }); }, onExitFullScreen: () { setState(() { showAppBar = true; }); }, ), )), ), ); } }
рдпрд╛ рдЖрдк рдХреЗрд╡рд▓ рдРрдкрдмрд╛рд░ рдореЗрдВ рдЯреВрд▓рдмрд╛рд░ рд╣рд╛рдЗрдЯ рдкрд░рдо рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ
56 рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╣реИ
AppBar(
title: Text('Your title'),
toolbarHeight: _fullScreen ? 0 : 56,
),
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдмрд╕ рдЕрдкрдиреЗ рдордЪрд╛рди рдХреЛ
YoutubePlayerBuilder
рдХреЗ рдиреАрдЪреЗ рд░рдЦреЗрдВ