opt: show listsheet item cover

This commit is contained in:
bggRGjQaUbCoE
2024-09-04 09:27:14 +08:00
parent f576e17b79
commit c1a95a4519
5 changed files with 92 additions and 27 deletions

View File

@@ -1,3 +1,6 @@
import 'package:PiliPalaX/common/widgets/network_img_layer.dart';
import 'package:PiliPalaX/models/bangumi/info.dart' as bangumi;
import 'package:PiliPalaX/models/video_detail_res.dart' as video;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
@@ -117,18 +120,46 @@ class _ListSheetContentState extends State<ListSheetContent> {
} }
}, },
dense: false, dense: false,
leading: isCurrentIndex leading: (episode is video.EpisodeItem && episode.arc?.pic != null) ||
? Image.asset( (episode is video.Part && episode.firstFrame != null) ||
'assets/images/live.png', (episode is bangumi.EpisodeItem && episode.cover != null)
color: primary, ? Container(
height: 12, margin: const EdgeInsets.symmetric(vertical: 6),
semanticLabel: "正在播放:", decoration: isCurrentIndex
? BoxDecoration(
borderRadius: BorderRadius.circular(6),
border: Border.all(
width: 1.8,
color: Theme.of(context).colorScheme.primary,
),
)
: null,
child: LayoutBuilder(
builder: (_, constraints) => NetworkImgLayer(
radius: 6,
src: episode is video.EpisodeItem
? episode.arc?.pic
: episode is bangumi.EpisodeItem
? episode.cover
: episode.firstFrame,
width: constraints.maxHeight * 16 / 9,
height: constraints.maxHeight,
),
),
) )
: null, : isCurrentIndex
? Image.asset(
'assets/images/live.png',
color: primary,
height: 12,
semanticLabel: "正在播放:",
)
: null,
title: Text( title: Text(
title, title,
style: TextStyle( style: TextStyle(
fontSize: 14, fontSize: 14,
fontWeight: isCurrentIndex ? FontWeight.bold : null,
color: isCurrentIndex color: isCurrentIndex
? primary ? primary
: Theme.of(context).colorScheme.onSurface, : Theme.of(context).colorScheme.onSurface,
@@ -191,6 +222,15 @@ class _ListSheetContentState extends State<ListSheetContent> {
); );
}, },
), ),
IconButton(
icon: const Icon(Icons.my_location),
onPressed: () {
itemScrollController.scrollTo(
index: currentIndex,
duration: const Duration(milliseconds: 200),
);
},
),
const Spacer(), const Spacer(),
IconButton( IconButton(
tooltip: '反序', tooltip: '反序',

View File

@@ -23,6 +23,7 @@ class NetworkImgLayer extends StatelessWidget {
this.origAspectRatio, this.origAspectRatio,
this.semanticsLabel, this.semanticsLabel,
this.ignoreHeight, this.ignoreHeight,
this.radius,
}); });
final String? src; final String? src;
@@ -35,6 +36,7 @@ class NetworkImgLayer extends StatelessWidget {
final double? origAspectRatio; final double? origAspectRatio;
final String? semanticsLabel; final String? semanticsLabel;
final bool? ignoreHeight; final bool? ignoreHeight;
final double? radius;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@@ -57,11 +59,13 @@ class NetworkImgLayer extends StatelessWidget {
? ClipRRect( ? ClipRRect(
clipBehavior: Clip.antiAlias, clipBehavior: Clip.antiAlias,
borderRadius: BorderRadius.circular( borderRadius: BorderRadius.circular(
type == 'avatar' radius != null
? 50 ? radius!
: type == 'emote' : type == 'avatar'
? 0 ? 50
: StyleString.imgRadius.x, : type == 'emote'
? 0
: StyleString.imgRadius.x,
), ),
child: CachedNetworkImage( child: CachedNetworkImage(
imageUrl: imageUrl, imageUrl: imageUrl,

View File

@@ -597,6 +597,18 @@ class UgcSeason {
} }
} }
class Arc {
Arc({
this.pic,
});
String? pic;
Arc.fromJson(Map<String, dynamic> json) {
pic = json['pic'] as String?;
}
}
class SectionItem { class SectionItem {
SectionItem({ SectionItem({
this.seasonId, this.seasonId,
@@ -636,6 +648,7 @@ class EpisodeItem {
this.page, this.page,
this.bvid, this.bvid,
this.badge, this.badge,
this.arc,
}); });
int? seasonId; int? seasonId;
int? sectionId; int? sectionId;
@@ -648,6 +661,7 @@ class EpisodeItem {
Part? page; Part? page;
String? bvid; String? bvid;
String? badge; String? badge;
Arc? arc;
EpisodeItem.fromJson(Map<String, dynamic> json) { EpisodeItem.fromJson(Map<String, dynamic> json) {
seasonId = json['season_id']; seasonId = json['season_id'];
@@ -661,5 +675,8 @@ class EpisodeItem {
page = Part.fromJson(json['page']); page = Part.fromJson(json['page']);
bvid = json['bvid']; bvid = json['bvid'];
badge = json['badge']; badge = json['badge'];
arc = json['arc'] == null
? null
: Arc.fromJson(json['arc'] as Map<String, dynamic>);
} }
} }

View File

@@ -71,8 +71,8 @@ class _VideoReplyPanelState extends State<VideoReplyPanel>
@override @override
void dispose() { void dispose() {
fabAnimationCtr.dispose();
_videoReplyController.scrollController.removeListener(() {}); _videoReplyController.scrollController.removeListener(() {});
fabAnimationCtr.dispose();
// _videoReplyController.scrollController.dispose(); // _videoReplyController.scrollController.dispose();
super.dispose(); super.dispose();
} }
@@ -92,9 +92,13 @@ class _VideoReplyPanelState extends State<VideoReplyPanel>
final ScrollDirection direction = final ScrollDirection direction =
_videoReplyController.scrollController.position.userScrollDirection; _videoReplyController.scrollController.position.userScrollDirection;
if (direction == ScrollDirection.forward) { if (direction == ScrollDirection.forward) {
_showFab(); if (mounted) {
_showFab();
}
} else if (direction == ScrollDirection.reverse) { } else if (direction == ScrollDirection.reverse) {
_hideFab(); if (mounted) {
_hideFab();
}
} }
}, },
); );

View File

@@ -42,10 +42,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: app_links name: app_links
sha256: "50437e5916e6f56c1ca53e967cbfd6d53b3451465b41eef05ba1533bf1e1c5ea" sha256: "7e058edbc78bd40b6a8227941b955f38320a4e799bc0983c8146bda41593a491"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.3.0" version: "6.3.1"
app_links_linux: app_links_linux:
dependency: transitive dependency: transitive
description: description:
@@ -243,10 +243,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: catcher_2 name: catcher_2
sha256: a15deaec342d7b10c44d71443a5ed66adda8cd70ae00dd2adfadb8958f7c5441 sha256: "9e5b5f0f1c06d48a83cbedb15d7b5fc0d785c6f3b835c5d7b1cc61b839d901ea"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.0-alpha.2" version: "2.0.0"
characters: characters:
dependency: transitive dependency: transitive
description: description:
@@ -411,10 +411,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: dio name: dio
sha256: "0dfb6b6a1979dac1c1245e17cef824d7b452ea29bd33d3467269f9bef3715fb0" sha256: "5598aa796bbf4699afd5c67c0f5f6e2ed542afc956884b9cd58c306966efc260"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.6.0" version: "5.7.0"
dio_cookie_manager: dio_cookie_manager:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -653,10 +653,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_smart_dialog name: flutter_smart_dialog
sha256: "3d376ba47f64391cc657f706815b32dd6ff2e0f80553a5c9f33b812ba7c59462" sha256: "6b5fd32cd2900745df30c1d95ef597ea0ee1ee8cfa557eab62010e3db1d3d717"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.9.8" version: "4.9.8+1"
flutter_svg: flutter_svg:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -1409,10 +1409,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: sentry name: sentry
sha256: "0f787e27ff617e4f88f7074977240406a9c5509444bac64a4dfa5b3200fb5632" sha256: "1af8308298977259430d118ab25be8e1dda626cdefa1e6ce869073d530d39271"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "8.7.0" version: "8.8.0"
share_plus: share_plus:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -1774,10 +1774,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: vm_service name: vm_service
sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "14.2.4" version: "14.2.5"
volume_controller: volume_controller:
dependency: transitive dependency: transitive
description: description: