74 lines
2.1 KiB
Dart
74 lines
2.1 KiB
Dart
|
|
import 'package:flutter/material.dart';
|
|||
|
|
import 'package:video_player/video_player.dart';
|
|||
|
|
|
|||
|
|
class VideoThumbnail extends StatefulWidget {
|
|||
|
|
final String videoUrl;
|
|||
|
|
|
|||
|
|
VideoThumbnail({required this.videoUrl});
|
|||
|
|
|
|||
|
|
@override
|
|||
|
|
_VideoThumbnailState createState() => _VideoThumbnailState();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
class _VideoThumbnailState extends State<VideoThumbnail> {
|
|||
|
|
late VideoPlayerController _controller;
|
|||
|
|
late Future<void> _initializeVideoPlayerFuture;
|
|||
|
|
|
|||
|
|
@override
|
|||
|
|
void initState() {
|
|||
|
|
super.initState();
|
|||
|
|
// 创建并初始化 VideoPlayerController
|
|||
|
|
_controller = VideoPlayerController.network(widget.videoUrl)
|
|||
|
|
..initialize().then((_) {
|
|||
|
|
// 当视频控制器初始化完成后,更新UI以便显示第一帧
|
|||
|
|
setState(() {});
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@override
|
|||
|
|
void dispose() {
|
|||
|
|
// 清理资源
|
|||
|
|
_controller.dispose();
|
|||
|
|
super.dispose();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@override
|
|||
|
|
Widget build(BuildContext context) {
|
|||
|
|
return GestureDetector(
|
|||
|
|
// onTap: () {
|
|||
|
|
// setState(() {
|
|||
|
|
// if (_controller.value.isPlaying) {
|
|||
|
|
// _controller.pause();
|
|||
|
|
// } else {
|
|||
|
|
// _controller.play();
|
|||
|
|
// }
|
|||
|
|
// });
|
|||
|
|
// },
|
|||
|
|
child: Stack(
|
|||
|
|
alignment: Alignment.center,
|
|||
|
|
children: <Widget>[
|
|||
|
|
// 如果视频已经初始化,则显示视频玩家
|
|||
|
|
_controller.value.isInitialized
|
|||
|
|
? AspectRatio(
|
|||
|
|
aspectRatio: 1 / 1, // 强制正方形比例
|
|||
|
|
child: FittedBox(
|
|||
|
|
fit: BoxFit.cover, // 确保视频封面铺满空间
|
|||
|
|
child: SizedBox(
|
|||
|
|
width: _controller.value.size.width,
|
|||
|
|
height: _controller.value.size.height,
|
|||
|
|
child: VideoPlayer(_controller),
|
|||
|
|
),
|
|||
|
|
),
|
|||
|
|
)
|
|||
|
|
: Center(
|
|||
|
|
child: CircularProgressIndicator(), // 加载中显示转圈
|
|||
|
|
),
|
|||
|
|
if (!_controller.value.isPlaying && _controller.value.isInitialized)
|
|||
|
|
Icon(Icons.play_arrow_rounded,
|
|||
|
|
size: 80, color: Colors.white.withOpacity(0.8)),
|
|||
|
|
],
|
|||
|
|
),
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
}
|