123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- import 'package:fis_ui/index.dart';
- import 'package:flutter/material.dart';
- import 'package:fis_measure/index.dart';
- import 'package:fis_measure/view/player/controller_old.dart';
- import 'package:fis_measure/view/player/enums.dart';
- import 'package:fis_measure/view/player/events.dart';
- import 'package:fis_vid/data_host/data_host.dart';
- /// 用于图像快速预览的简单播放器
- /// 构造结束后自动播放一遍,然后显示第一帧
- class FQuickPreview extends StatefulWidget {
- final String vidUrl;
- final String imageUrl;
- final double? width;
- final double? height;
- FQuickPreview(
- {required this.vidUrl, required this.imageUrl, this.width, this.height});
- @override
- _FQuickPreviewState createState() => _FQuickPreviewState();
- }
- class _FQuickPreviewState extends State<FQuickPreview> {
- late final VidPlayerControllerNoSharing _playerController;
- bool isShowCover = true;
- bool isShowLoading = true;
- @override
- void initState() {
- final dataHost = VidDataHost(widget.vidUrl);
- final playerController = VidPlayerControllerNoSharing(dataHost: dataHost);
- _playerController = playerController;
- loadVidDataHost(_playerController);
- _playerController.eventHandler.addListener(onControllerEvent);
- super.initState();
- }
- @override
- void dispose() {
- _playerController.eventHandler.removeListener(onControllerEvent);
- _playerController.dispose();
- super.dispose();
- }
- void onControllerEvent(Object sender, VidPlayerEvent e) {
- if (e is VidPlayerStatusChangeEvent) {
- if (e.status == VidPlayStatus.pause) {
- setState(() {
- isShowCover = true;
- });
- }
- }
- }
- void loadVidDataHost(VidPlayerControllerNoSharing playerController) async {
- int retryCount = 0;
- while (retryCount < 3) {
- try {
- bool success = await playerController.load();
- if (!success) {
- throw "loadVidDataHost failed";
- }
- setState(() {
- isShowLoading = false;
- });
- if (playerController.totalFramesCount <= 1) {
- return; // 单帧图只显示封面,不播放
- }
- playerController.play();
- await Future.delayed(const Duration(milliseconds: 100));
- setState(() {
- isShowCover = false;
- });
- return;
- } catch (e) {
- retryCount++;
- if (retryCount == 3) {
- setState(() {
- isShowLoading = false;
- });
- } else if (!mounted) {
- return; // 如果组件已经被销毁,则停止重试
- }
- }
- }
- }
- @override
- Widget build(BuildContext context) {
- return Stack(children: <Widget>[
- Offstage(
- offstage: !isShowCover,
- child: Container(
- child: Image.network(
- widget.imageUrl,
- width: widget.width,
- height: widget.height,
- fit: BoxFit.contain,
- loadingBuilder: (context, child, loadingProgress) =>
- loadingProgress == null
- ? child
- : Center(
- child: CircularProgressIndicator(
- value: loadingProgress.expectedTotalBytes != null
- ? loadingProgress.cumulativeBytesLoaded /
- loadingProgress.expectedTotalBytes!
- : null,
- ),
- ),
- ),
- ),
- ),
- // 使用 Offstage 组件来控制第二个组件的可见性
- Offstage(
- offstage: isShowCover,
- child: Center(
- child: RepaintBoundary(
- child: VidPlayer(_playerController),
- ),
- )),
- Align(
- alignment: Alignment.topRight,
- child: Offstage(
- child: Container(
- padding: EdgeInsets.all(10),
- width: 50,
- height: 50,
- child: CircularProgressIndicator(),
- ),
- offstage: !isShowLoading,
- )),
- ]);
- }
- }
|