Files
PiliPlus/lib/pages/search_panel/live/widgets/item.dart
bggRGjQaUbCoE c05fbde3fa opt item
Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
2025-06-13 17:36:03 +08:00

131 lines
4.1 KiB
Dart

import 'package:PiliPlus/common/constants.dart';
import 'package:PiliPlus/common/widgets/image/image_save.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/models/search/result.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
class LiveItem extends StatelessWidget {
final SearchLiveItemModel liveItem;
const LiveItem({super.key, required this.liveItem});
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
return Card(
clipBehavior: Clip.hardEdge,
child: InkWell(
onTap: () => Get.toNamed('/liveRoom?roomid=${liveItem.roomid}'),
onLongPress: () => imageSaveDialog(
title: liveItem.title.map((item) => item.text).join(),
cover: liveItem.cover,
),
child: Column(
children: [
AspectRatio(
aspectRatio: StyleString.aspectRatio,
child: LayoutBuilder(builder: (context, boxConstraints) {
double maxWidth = boxConstraints.maxWidth;
double maxHeight = boxConstraints.maxHeight;
return Stack(
clipBehavior: Clip.none,
children: [
NetworkImgLayer(
src: liveItem.cover,
width: maxWidth,
height: maxHeight,
radius: 0,
),
Positioned(
left: 0,
right: 0,
bottom: 0,
child: AnimatedOpacity(
opacity: 1,
duration: const Duration(milliseconds: 200),
child: liveStat(
liveItem.online,
liveItem.cateName,
),
),
),
],
);
}),
),
liveContent(theme)
],
),
),
);
}
Widget liveContent(ThemeData theme) => Expanded(
child: Padding(
padding: const EdgeInsets.fromLTRB(9, 8, 9, 6),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text.rich(
TextSpan(
children: liveItem.title
.map((e) => TextSpan(
text: e.text,
style: TextStyle(
color: e.isEm
? theme.colorScheme.primary
: theme.colorScheme.onSurface,
),
))
.toList()),
),
SizedBox(
width: double.infinity,
child: Text(
liveItem.uname!,
maxLines: 1,
style: TextStyle(
fontSize: theme.textTheme.labelMedium!.fontSize,
color: theme.colorScheme.outline,
),
),
),
],
),
),
);
Widget liveStat(int? online, String? cateName) {
return Container(
height: 45,
padding: const EdgeInsets.only(top: 22, left: 8, right: 8),
decoration: const BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: <Color>[
Colors.transparent,
Colors.black54,
],
tileMode: TileMode.mirror,
),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
cateName!,
style: const TextStyle(fontSize: 11, color: Colors.white),
),
Text(
'围观:${online.toString()}',
style: const TextStyle(fontSize: 11, color: Colors.white),
)
],
),
);
}
}