feat: like count (#1640)

This commit is contained in:
My-Responsitories
2025-10-19 13:45:29 +08:00
committed by GitHub
parent 71a170deb5
commit 6e1ceb1277
7 changed files with 139 additions and 124 deletions

View File

@@ -11,9 +11,16 @@ class VideoDanmaku extends DanmakuExtra {
@override
final String mid;
int like;
bool isLike;
VideoDanmaku({required this.id, required this.mid, this.isLike = false});
VideoDanmaku({
required this.id,
required this.mid,
this.like = 0,
this.isLike = false,
});
}
class LiveDanmaku extends DanmakuExtra {

View File

@@ -115,6 +115,11 @@ class _PlDanmakuState extends State<PlDanmaku> {
DmUtils.decimalToColor(e.color),
e.fontsize.toDouble(),
jsonDecode(e.content.replaceAll('\n', '\\n')),
extra: VideoDanmaku(
id: e.id.toInt(),
mid: e.midHash,
like: e.like.toInt(),
),
),
);
} catch (_) {}
@@ -131,7 +136,11 @@ class _PlDanmakuState extends State<PlDanmaku> {
e.colorful == DmColorfulType.VipGradualColor,
count: e.hasCount() ? e.count : null,
selfSend: e.isSelf,
extra: VideoDanmaku(id: e.id.toInt(), mid: e.midHash),
extra: VideoDanmaku(
id: e.id.toInt(),
mid: e.midHash,
like: e.like.toInt(),
),
),
);
}

View File

@@ -83,6 +83,11 @@ class HeaderControl extends StatefulWidget {
);
if (res.isSuccess) {
extra.isLike = isLike;
if (isLike) {
extra.like++;
} else {
extra.like--;
}
SmartDialog.showToast('${isLike ? '' : '取消'}点赞成功');
return true;
} else {
@@ -2059,19 +2064,37 @@ class HeaderControlState extends State<HeaderControl> {
mainAxisSize: MainAxisSize.min,
children: [
Builder(
builder: (context) => iconButton(
onPressed: () async {
if (await HeaderControl.likeDanmaku(
extra,
plPlayerController.cid!,
) &&
context.mounted) {
(context as Element).markNeedsBuild();
}
},
icon: extra.isLike
? const Icon(Icons.thumb_up_off_alt_sharp)
: const Icon(Icons.thumb_up_off_alt_outlined),
builder: (context) => Stack(
clipBehavior: Clip.none,
children: [
iconButton(
onPressed: () async {
if (await HeaderControl.likeDanmaku(
extra,
plPlayerController.cid!,
) &&
context.mounted) {
(context as Element).markNeedsBuild();
}
},
icon: extra.isLike
? const Icon(Icons.thumb_up_off_alt_sharp)
: const Icon(Icons.thumb_up_off_alt_outlined),
),
if (extra.like > 0)
Positioned(
left: 24.5,
top: 1.5,
child: Text(
extra.like.toString(),
style: const TextStyle(
fontSize: 10.5,
letterSpacing: 0,
// fontWeight: FontWeight.bold,
),
),
),
],
),
),
if (item.content.selfSend)