1. 引入相关插件
- iOS:
- 在
pubspec.yaml
文件中添加支持iOS的视频播放插件,例如video_player
插件。video_player
插件可用于在Flutter中播放本地和网络视频,在iOS上它基于AVFoundation
框架。添加如下依赖:
dependencies:
video_player: ^2.3.0
- 运行`flutter pub get`命令,下载并引入该插件到项目中。
- Android:
- 同样在
pubspec.yaml
文件中添加video_player
插件依赖,在Android上它基于ExoPlayer
。ExoPlayer
是一个功能强大的开源媒体播放器,适用于Android平台。依赖添加后同样运行flutter pub get
。
2. iOS 特定配置
- 权限配置:如果要播放网络视频,需要在
Info.plist
文件中添加网络权限配置。在<dict>
标签内添加:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
- 初始化播放器:
- 在Flutter代码中,创建
VideoPlayerController
对象,例如:
import 'package:video_player/video_player.dart';
late VideoPlayerController _controller;
@override
void initState() {
super.initState();
_controller = VideoPlayerController.network('https://example.com/video.mp4');
_controller.initialize().then((_) {
setState(() {});
});
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
3. Android 特定配置
- 权限配置:在
AndroidManifest.xml
文件中添加权限,例如如果要播放网络视频,添加网络权限:
<uses - permission android:name="android.permission.INTERNET" />
- 初始化播放器:
- 同样在Flutter代码中创建
VideoPlayerController
对象,与iOS类似:
import 'package:video_player/video_player.dart';
late VideoPlayerController _controller;
@override
void initState() {
super.initState();
_controller = VideoPlayerController.network('https://example.com/video.mp4');
_controller.initialize().then((_) {
setState(() {});
});
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
4. 使用播放器
- 创建一个包含
VideoPlayer
和VideoProgressIndicator
等组件的Widget来展示和控制视频播放,例如:
import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';
class VideoPlayerScreen extends StatefulWidget {
const VideoPlayerScreen({Key? key}) : super(key: key);
@override
State<VideoPlayerScreen> createState() => _VideoPlayerScreenState();
}
class _VideoPlayerScreenState extends State<VideoPlayerScreen> {
late VideoPlayerController _controller;
@override
void initState() {
super.initState();
_controller = VideoPlayerController.network('https://example.com/video.mp4');
_controller.initialize().then((_) {
setState(() {});
});
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Video Player')),
body: Center(
child: _controller.value.isInitialized
? AspectRatio(
aspectRatio: _controller.value.aspectRatio,
child: Stack(
children: [
VideoPlayer(_controller),
VideoProgressIndicator(_controller, allowScrubbing: true),
Center(
child: IconButton(
icon: Icon(_controller.value.isPlaying ? Icons.pause : Icons.play_arrow),
onPressed: () {
setState(() {
_controller.value.isPlaying? _controller.pause() : _controller.play();
});
},
)
)
]
)
)
: Container()
)
);
}
}