Flutter開發過程中,對于視頻播放的三方組件有很多,在Android端適配都挺好,但是在適配iPhone手機的時候,如果設置了UIInterfaceOrientationLandscapeLeft
和UIInterfaceOrientationLandscapeRight
都為false的情況下,無法做到全屏播放,因為FLutter的SystemChrome.setPreferredOrientations
方法不適配iOS端,無法控制屏幕進行旋轉,下面我們看效果
在Android手機上效果
在IPhone手機上效果
我們可以看到,當在iPhone手機上進行全屏播放的時候,屏幕并沒有旋轉過來,查閱了很多資料,都沒能很好的解決,后來只能自己在iOS端用原生寫了個播放器,利用FLutter嵌入原生的開發模式來適配全屏播放,
最終效果如下
如果有什么好的方法解決這個在iOS不能旋轉屏幕的想法的,歡迎在下方留言。。。。
下面貼出代碼
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,});@overrideState<VideoPlayerWidget> createState() => _VideoPlayerWidgetState();
}class _VideoPlayerWidgetState extends State<VideoPlayerWidget> {late VideoPlayerController _videoPlayerController;ChewieController? _chewieController;int? bufferDelay;@overridevoid initState() {super.initState();initializePlayer();}@overridevoid 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 {//判斷是本地視頻還是網絡請求下來的視頻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,);}@overrideWidget 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
的錯誤,關閉App,重新運行(Flutter run)就行了
視頻播放鏈接https://assets.mixkit.co/videos/preview/mixkit-spinning-around-the-earth-29351-large.mp4
2、使用的時候區分了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('點擊播放視頻'),),),
3、iOS端的代碼(用OC實現的)(只貼出文件目錄,需要的同學可以直接去GitHub上下載原代碼)
因為寫視頻播放器的時候用到了Masonry
三方,所有用戶需要再Podfile
里面加入pod 'Masonry'
,然后cd到Runner目錄下,運行pod install
安裝Masonry
4、最后在AppDelegate.m
里面注冊一下
[FlutterViewRegistran registerWithRegistry:self];
5、Git代碼傳送門
喜歡的同學歡迎幫忙點個star😄😄 簡書傳送門