Flutter視頻播放器在iOS端和Android端都能實(shí)現(xiàn)全屏播放

Flutter開(kāi)發(fā)過(guò)程中符隙,對(duì)于視頻播放的三方組件有很多罚随,在A(yíng)ndroid端適配都挺好,但是在適配iPhone手機(jī)的時(shí)候猬膨,如果設(shè)置了UIInterfaceOrientationLandscapeLeftUIInterfaceOrientationLandscapeRight都為false的情況下尔崔,無(wú)法做到全屏播放赋元,因?yàn)镕Lutter的SystemChrome.setPreferredOrientations方法不適配iOS端霜幼,無(wú)法控制屏幕進(jìn)行旋轉(zhuǎn)盔憨,下面我們看效果

在A(yíng)ndroid手機(jī)上效果

gif.gif

在IPhone手機(jī)上效果

gif.gif
我們可以看到热康,當(dāng)在iPhone手機(jī)上進(jìn)行全屏播放的時(shí)候,屏幕并沒(méi)有旋轉(zhuǎn)過(guò)來(lái)鹤盒,查閱了很多資料蚕脏,都沒(méi)能很好的解決,后來(lái)只能自己在iOS端用原生寫(xiě)了個(gè)播放器侦锯,利用FLutter嵌入原生的開(kāi)發(fā)模式來(lái)適配全屏播放驼鞭,

最終效果如下

gif.gif

如果有什么好的方法解決這個(gè)在iOS不能旋轉(zhuǎn)屏幕的想法的,歡迎在下方留言尺碰。挣棕。。亲桥。

下面貼出代碼

1洛心、FLutter視頻播放器采用的是chewie

封裝的播放器代碼如下:

import 'dart:io';
import 'package:chewie/chewie.dart';
import 'package:flutter/material.dart';
// ignore: depend_on_referenced_packages
import 'package:video_player/video_player.dart';

class VideoPlayerWidget extends StatefulWidget {
  final String videoUrl;
  final bool fullScreenByDefault;
  const VideoPlayerWidget({
    super.key,
    required this.videoUrl,
    this.fullScreenByDefault = false,
  });

  @override
  State<VideoPlayerWidget> createState() => _VideoPlayerWidgetState();
}

class _VideoPlayerWidgetState extends State<VideoPlayerWidget> {
  late VideoPlayerController _videoPlayerController;
  ChewieController? _chewieController;
  int? bufferDelay;

  @override
  void initState() {
    super.initState();
    initializePlayer();
  }

  @override
  void dispose() {
    _videoPlayerController.dispose();
    _chewieController?.dispose();
    super.dispose();
  }

  List<String> srcs = [
    "https://assets.mixkit.co/videos/preview/mixkit-spinning-around-the-earth-29351-large.mp4",
    "https://assets.mixkit.co/videos/preview/mixkit-daytime-city-traffic-aerial-view-56-large.mp4",
    "https://assets.mixkit.co/videos/preview/mixkit-a-girl-blowing-a-bubble-gum-at-an-amusement-park-1226-large.mp4"
  ];

  Future<void> initializePlayer() async {
    //判斷是本地視頻還是網(wǎng)絡(luò)請(qǐng)求下來(lái)的視頻
    if (widget.videoUrl.contains('http')) {
      _videoPlayerController =
          VideoPlayerController.networkUrl(Uri.parse(widget.videoUrl));
    } else {
      _videoPlayerController =
          VideoPlayerController.file(File(widget.videoUrl));
    }
    await Future.wait([
      _videoPlayerController.initialize(),
    ]);
    _createChewieController();
    setState(() {});
  }

  void _createChewieController() {
    _chewieController = ChewieController(
      videoPlayerController: _videoPlayerController,
      autoPlay: true,
      hideControlsTimer: const Duration(seconds: 10),
      allowPlaybackSpeedChanging: false,
      fullScreenByDefault: widget.fullScreenByDefault,
    );
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      color: const Color.fromRGBO(28, 34, 47, 1),
      width: MediaQuery.of(context).size.width - 20,
      height: 300,
      child: Center(
        child: _chewieController != null &&
                _chewieController!.videoPlayerController.value.isInitialized
            ? Chewie(
                controller: _chewieController!,
              )
            : const Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  CircularProgressIndicator(),
                  SizedBox(height: 20),
                  Text(
                    'Loading',
                    style: TextStyle(
                      color: Colors.white,
                    ),
                  ),
                ],
              ),
      ),
    );
  }
}

如果碰到Video Player "UnimplementedError: init() has not been implemented的錯(cuò)誤,關(guān)閉App题篷,重新運(yùn)行(Flutter run)就行了
視頻播放鏈接https://assets.mixkit.co/videos/preview/mixkit-spinning-around-the-earth-29351-large.mp4

2词身、使用的時(shí)候區(qū)分了Android端和iOS端

body: Center(
        child: ElevatedButton(
          onPressed: () {
            showDialog(
              context: context,
              builder: (context) {
                return Dialog(
                  insetPadding: const EdgeInsets.only(left: 0),
                  child: Platform.isAndroid
                      ? const VideoPlayerWidget(
                          videoUrl: videoUrl,
                        ) //Android視頻播放器
                      : SizedBox(
                          width: MediaQuery.of(context).size.width,
                          height: MediaQuery.of(context).size.width * 9 / 16,
                          child: const UiKitView(
                            viewType:
                                'plugins.flutter.io/custom_platform_view_plugin',
                            creationParams: {
                              'videoUrl': videoUrl,
                            },
                            creationParamsCodec: StandardMessageCodec(),
                          ),
                        ), //iOS視頻播放器
                );
              },
            );
          },
          child: const Text('點(diǎn)擊播放視頻'),
        ),
      ),

3、iOS端的代碼(用OC實(shí)現(xiàn)的)(只貼出文件目錄番枚,需要的同學(xué)可以直接去GitHub上下載原代碼)

image.png

因?yàn)閷?xiě)視頻播放器的時(shí)候用到了Masonry三方法严,所有用戶(hù)需要再Podfile里面加入pod 'Masonry',然后cd到Runner目錄下葫笼,運(yùn)行pod install安裝Masonry

image.png

4深啤、最后在AppDelegate.m里面注冊(cè)一下

[FlutterViewRegistran registerWithRegistry:self];

image.png

5、Git代碼傳送門(mén)

喜歡的同學(xué)歡迎幫忙點(diǎn)個(gè)star????CSDN傳送門(mén)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末路星,一起剝皮案震驚了整個(gè)濱河市溯街,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌洋丐,老刑警劉巖呈昔,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異友绝,居然都是意外死亡堤尾,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)九榔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事哲泊∈s埃” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵切威,是天一觀(guān)的道長(zhǎng)育特。 經(jīng)常有香客問(wèn)我,道長(zhǎng)先朦,這世上最難降的妖魔是什么缰冤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮喳魏,結(jié)果婚禮上棉浸,老公的妹妹穿的比我還像新娘。我一直安慰自己刺彩,他們只是感情好迷郑,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著创倔,像睡著了一般嗡害。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上畦攘,一...
    開(kāi)封第一講書(shū)人閱讀 52,246評(píng)論 1 308
  • 那天霸妹,我揣著相機(jī)與錄音,去河邊找鬼知押。 笑死叹螟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的朗徊。 我是一名探鬼主播首妖,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼爷恳!你這毒婦竟也來(lái)了有缆?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤温亲,失蹤者是張志新(化名)和其女友劉穎棚壁,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體栈虚,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡袖外,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了魂务。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片曼验。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡泌射,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鬓照,到底是詐尸還是另有隱情熔酷,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布豺裆,位于F島的核電站拒秘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏臭猜。R本人自食惡果不足惜躺酒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蔑歌。 院中可真熱鬧羹应,春花似錦、人聲如沸丐膝。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)帅矗。三九已至偎肃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間浑此,已是汗流浹背累颂。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凛俱,地道東北人紊馏。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蒲犬,于是被迫代替她去往敵國(guó)和親朱监。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容