lib/ui/aliplayer_seek_thumbnail_widget.dart (64 lines of code) (raw):
// Copyright © 2025 Alibaba Cloud. All rights reserved.
//
// Author: keria
// Date: 2025/2/12
// Brief: 播放器 seek 缩略图控件
import 'package:aliplayer_widget/utils/format_util.dart';
import 'package:flutter/material.dart';
/// 播放器 seek 缩略图控件
///
/// A widget that displays a thumbnail and time information during seeking.
class AliPlayerSeekThumbnailWidget extends StatefulWidget {
/// 缩略图的图片,可以为空
///
/// Thumbnail image, can be null
final MemoryImage? thumbnail;
/// 当前 seek 到的时间
///
/// Current seek time
final Duration currentSeekTime;
/// 视频的总时长
///
/// Total video duration
final Duration totalDuration;
/// 控制控件的可见性
///
/// Visibility of the widget
final bool isVisible;
const AliPlayerSeekThumbnailWidget({
required this.isVisible,
required this.currentSeekTime,
required this.totalDuration,
this.thumbnail,
super.key,
});
@override
State<AliPlayerSeekThumbnailWidget> createState() =>
_AliPlayerSeekThumbnailWidgetState();
}
class _AliPlayerSeekThumbnailWidgetState
extends State<AliPlayerSeekThumbnailWidget> {
@override
Widget build(BuildContext context) {
// 如果控件不可见,直接返回空组件,避免不必要的构建
if (!widget.isVisible) {
return const SizedBox.shrink();
}
return Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
_buildThumbnailImage(),
const SizedBox(height: 8.0),
_buildTimeText(),
],
),
);
}
/// 构建缩略图图片
///
/// Build the thumbnail image
Widget _buildThumbnailImage() {
return widget.thumbnail != null
? Image(
image: widget.thumbnail!,
fit: BoxFit.cover,
)
: const SizedBox.shrink();
}
/// 构建时间文本
///
/// Build the time text
Widget _buildTimeText() {
return Text(
'${FormatUtil.formatDuration(widget.currentSeekTime)} / ${FormatUtil.formatDuration(widget.totalDuration)}',
style: const TextStyle(
fontSize: 16,
color: Colors.white,
fontWeight: FontWeight.bold,
),
);
}
/// 状态更新回调
/// 当 Widget 的状态被更新时,该方法被调用。
///
/// Called when the state of the widget is updated.
@override
void didUpdateWidget(covariant AliPlayerSeekThumbnailWidget oldWidget) {
super.didUpdateWidget(oldWidget);
// Update if visibility changes or if any other relevant property changes
if (oldWidget.isVisible != widget.isVisible ||
oldWidget.currentSeekTime != widget.currentSeekTime ||
oldWidget.thumbnail != widget.thumbnail) {
setState(() {});
}
}
}