【问题标题】:Flutter youtube_player_flutter: ^7.0.0+6 full ScreenFlutter youtube_player_flutter:^7.0.0+6 全屏
【发布时间】:2020-10-21 12:08:32
【问题描述】:

我正在使用这个插件youtube_player_flutter: ^7.0.0+6 来播放 youtube 视频。问题是,当我尝试以全屏横向播放视频时,视频播放时会从边缘剪切并以横向覆盖整个屏幕

在这里你可以看到视频没有覆盖完整的高度和宽度

我的代码

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:youtube_player_flutter/youtube_player_flutter.dart';

class video extends StatefulWidget {
  @override
  _videoState createState() => _videoState();
}

class _videoState extends State<video> {
  String videoURL = "https://www.youtube.com/watch?v=oxsBSCf5-B8&list=RDoxsBSCf5-B8&start_radio=1";

  YoutubePlayerController _controller;

  @override
  void initState() {

    _controller = YoutubePlayerController(
        initialVideoId: YoutubePlayer.convertUrlToId(videoURL)
    );

    super.initState();
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: SingleChildScrollView(
          child: Container(
            child:Column(
              crossAxisAlignment:CrossAxisAlignment.stretch,
              children: <Widget>[
                YoutubePlayerBuilder(
                  player: YoutubePlayer(
                    controller: _controller,
                    aspectRatio:16/9,

                    showVideoProgressIndicator: true,
                  ),
                builder:(context,player){
                    return Column(
                    children: <Widget>[
                     player
                    ],
                    );
                },
                ),
              ],
            ),
          ),
        ),
      ),


    );
  }
}

【问题讨论】:

  • 克里斯托弗·摩尔请告诉我?

标签: android ios flutter dart


【解决方案1】:

我刚才也遇到了同样的问题。
我试过这个,它似乎适用于全屏。还添加了一个OrientationBuilder,用于仅在横向模式下删除AppBar。\

@override
Widget build(BuildContext context) {
  return WillPopScope(
    onWillPop: _onWillPop,
    child: OrientationBuilder(builder: 
           (BuildContext context, Orientation orientation) {
      if (orientation == Orientation.landscape) {
        return Scaffold(
          body: youtubeHirarchy(),
        );
      } else {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: youtubeHirarchy(),
        );
      }
    }),
  );
}

youtubeHierarchy() {
  return Container(
    child: Align(
      alignment: Alignment.center,
      child: FittedBox(
        fit: BoxFit.fill,
        child: YoutubePlayer(
          controller: _controller,
        ),
      ),
    ),
  );
}

(onWillPop 用于在返回时暂停视频)
似乎在实际视频后面有 youtube 的默认菜单。如果您想出更好的解决方案,请告诉我。

【讨论】:

    【解决方案2】:

    如果你想要达到的是

    1. 在整个屏幕上显示视频(全屏)

    2. 与其他小部件一起在纵向上显示视频小部件

    我是这样解决的

       child: OrientationBuilder(
        
        builder: (context, orientaion) {
         switch(orientaion){
           
           case Orientation.portrait:
            return Scaffold(
              resizeToAvoidBottomInset: true,
              backgroundColor: Theme.of(context).appBarTheme.color,
              appBar: AppBar(
                // title: Text(widget.video.title),
                title: Text(
                  "Detail",
                  style: TextStyle(fontSize: 15, fontWeight: FontWeight.bold),
                ),
              ),
              body: Body);
      
             // TODO: Handle this case.
             break;
           case Orientation.landscape:
            return Scaffold(
              resizeToAvoidBottomInset: true,
              backgroundColor: Theme.of(context).appBarTheme.color,
             
              body: Body());
      
             // TODO: Handle this case.
             break;
         }
         
        }
      ),
    

    基于方向构建主体

    bool fullScreen = false;
    
    YoutubePlayerBuilder _buildBurnerWidgetContent() {
      return YoutubePlayerBuilder(
        onEnterFullScreen: () {
          this.fullScreen = true;
        },
        onExitFullScreen: () {
          this.fullScreen = false;
        },
        player: YoutubePlayer(
          aspectRatio: 16 / 9,
          controller: _youtubecontroller,
          showVideoProgressIndicator: true,
          onReady: () {},
          progressColors: ProgressBarColors(
            playedColor: Colors.amber,
            handleColor: Colors.amberAccent,
          ),
        ),
        builder: (context, player) {
          return Column(
            children: [
              // some widgets
              // player,
              //some other widgets
            ],
          );
        });
    

    }

    在构建具有不同部分的主体时,我检查屏幕方向

    import 'package:flutter/material.dart';
    
    class Body extends StatefulWidget {
      @override
      _hhState createState() => _hhState();
    }
    
    class _hhState extends State<Body> {
      bool fullScreen;
    
      @override
      Widget build(BuildContext context) {
        return Container(
            child: Column(children: <Widget>[
          Flexible(flex: 5, child: _buildBurnerWidgetContent()),
          !this.fullScreen
              ? Padding(padding: null, child: Text("description"))
              : Container(),
          !this.fullScreen
              ? Padding(padding: null, child: Text("TabView"))
              : Container(),
          !this.fullScreen
              ? Padding(padding: null, child: Text("comments"))
              : Container()
        ]));
      }
    
      _buildBurnerWidgetContent() {}
    }
    

    【讨论】:

      【解决方案3】:

      如果使用ListView.separated,可以将视频全屏打开

      body: ListView.separated(
          itemBuilder: (context, index) {
            return YoutubePlayer(
              key: ObjectKey(_controllers[index]),
              controller: _controllers[index],
              actionsPadding: const EdgeInsets.only(left: 16.0),
              bottomActions: [
                CurrentPosition(),
                const SizedBox(width: 10.0),
                ProgressBar(isExpanded: true),
                const SizedBox(width: 10.0),
                RemainingDuration(),
                FullScreenButton(),
              ],
            );
          },
          itemCount: _controllers.length,
          separatorBuilder: (context, _) => const SizedBox(height: 10.0),
        ),
      );
      

      }

      enter link description here

      【讨论】:

      • 您甚至没有测试此代码,它只是缩放视频以匹配 listView 大小。它不会全屏打开视频。
      【解决方案4】:

      所以我也遇到了类似的问题,解决方案实际上在他们的 pub.dev 文档中。 您需要在小部件树的顶部添加 youtubeplayerbuilder,其他所有内容(如脚手架)都将从它的 builder 方法返回。 https://pub.dev/packages/youtube_player_flutter enter image description here

      【讨论】:

        猜你喜欢
        • 2020-11-17
        • 1970-01-01
        • 2020-03-30
        • 2019-02-25
        • 1970-01-01
        • 2021-05-13
        • 2021-09-26
        • 2012-10-01
        • 1970-01-01
        相关资源
        最近更新 更多