Files
video/app/lib/screens/feed/widgets/video_info_section.dart
T
2026-10-15 20:36:59 +08:00

93 lines
2.9 KiB
Dart

import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import '../../../core/theme/app_theme.dart';
import '../../../models/video_item.dart';
/// 左下信息区(《01-开发文档》5.2.1):
/// 作者昵称、标题(标题后 #标签,点击跳转标签视频页)、描述(展开/收起)
class VideoInfoSection extends StatefulWidget {
const VideoInfoSection({super.key, required this.item});
final VideoItem item;
@override
State<VideoInfoSection> createState() => _VideoInfoSectionState();
}
class _VideoInfoSectionState extends State<VideoInfoSection> {
bool _expanded = false;
@override
Widget build(BuildContext context) {
final item = widget.item;
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
// 昵称
Text(
'@${item.author.nickname}',
style: const TextStyle(
color: Colors.white,
fontSize: 16,
fontWeight: FontWeight.w700,
shadows: [Shadow(color: Colors.black54, blurRadius: 4)],
),
),
const SizedBox(height: 8),
// 标题 + #标签(点击标签跳转标签视频页)
Wrap(
crossAxisAlignment: WrapCrossAlignment.center,
spacing: 6,
runSpacing: 4,
children: [
if (item.title.isNotEmpty)
Text(
item.title,
style: const TextStyle(
color: Colors.white,
fontSize: 15,
shadows: [Shadow(color: Colors.black54, blurRadius: 4)],
),
),
for (final tag in item.tags)
GestureDetector(
onTap: () => context.push('/tags/${Uri.encodeComponent(tag)}'),
child: Text(
'#$tag',
style: const TextStyle(
color: AppColors.secondary,
fontSize: 15,
fontWeight: FontWeight.w600,
shadows: [Shadow(color: Colors.black54, blurRadius: 4)],
),
),
),
],
),
// 描述(展开/收起)
if (item.description.isNotEmpty) ...[
const SizedBox(height: 6),
GestureDetector(
onTap: () => setState(() => _expanded = !_expanded),
child: Text(
item.description,
maxLines: _expanded ? null : 1,
overflow: _expanded ? null : TextOverflow.ellipsis,
style: const TextStyle(color: AppColors.textSecondary, fontSize: 13),
),
),
if (!_expanded && item.description.length > 30)
const Text(
'展开',
style: TextStyle(color: AppColors.textWeak, fontSize: 12),
),
],
],
);
}
}