diff --git a/lib/common/widgets/video_popup_menu.dart b/lib/common/widgets/video_popup_menu.dart index 6d12a6711..21bd87107 100644 --- a/lib/common/widgets/video_popup_menu.dart +++ b/lib/common/widgets/video_popup_menu.dart @@ -118,6 +118,7 @@ class VideoPopupMenu extends StatelessWidget { return Dialog( child: ConstrainedBox( constraints: const BoxConstraints( + minWidth: 280, maxWidth: 420, ), child: Padding( diff --git a/lib/pages/dynamics/widgets/vote.dart b/lib/pages/dynamics/widgets/vote.dart index e2caab52c..b41148b05 100644 --- a/lib/pages/dynamics/widgets/vote.dart +++ b/lib/pages/dynamics/widgets/vote.dart @@ -436,18 +436,19 @@ Future showVoteDialog( showDialog( context: context, builder: (context) => Dialog( - child: ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 625), - child: Padding( - padding: const EdgeInsets.all(24), - child: VotePanel( - voteInfo: voteInfo.data, - callback: (votes, anonymity) => DynamicsHttp.doVote( - voteId: voteId, - votes: votes.toList(), - anonymity: anonymity, - dynamicId: dynamicId, - ), + constraints: const BoxConstraints( + minWidth: 280, + maxWidth: 625, + ), + child: Padding( + padding: const EdgeInsets.all(24), + child: VotePanel( + voteInfo: voteInfo.data, + callback: (votes, anonymity) => DynamicsHttp.doVote( + voteId: voteId, + votes: votes.toList(), + anonymity: anonymity, + dynamicId: dynamicId, ), ), ), diff --git a/lib/pages/live_room/widgets/header_control.dart b/lib/pages/live_room/widgets/header_control.dart index 9424814bf..1dcd77db9 100644 --- a/lib/pages/live_room/widgets/header_control.dart +++ b/lib/pages/live_room/widgets/header_control.dart @@ -54,6 +54,7 @@ class _LiveHeaderControlState extends State Widget child; if (widget.title case final title?) { child = MarqueeText( + key: titleKey, title, spacing: 30, velocity: 30, diff --git a/lib/pages/video/controller.dart b/lib/pages/video/controller.dart index aa71fa1c7..eb3cb79e0 100644 --- a/lib/pages/video/controller.dart +++ b/lib/pages/video/controller.dart @@ -273,7 +273,9 @@ class VideoDetailController extends GetxController late final watchProgress = GStorage.watchProgress; void cacheLocalProgress() { - if (playedTime case final playedTime?) { + if (plPlayerController.playerStatus.completed) { + watchProgress.put(cid.value.toString(), entry.totalTimeMilli); + } else if (playedTime case final playedTime?) { watchProgress.put(cid.value.toString(), playedTime.inMilliseconds); } } diff --git a/lib/pages/video/member/view.dart b/lib/pages/video/member/view.dart index 2f3b21782..02552707f 100644 --- a/lib/pages/video/member/view.dart +++ b/lib/pages/video/member/view.dart @@ -190,10 +190,10 @@ class _HorizontalMemberPageState extends State { LoadingState?> loadingState, ) { return switch (loadingState) { - Loading() => SliverPrototypeExtentList.builder( + Loading() => SliverFixedExtentList.builder( itemCount: 10, itemBuilder: (_, _) => const VideoCardHSkeleton(), - prototypeItem: const VideoCardHSkeleton(), + itemExtent: 100, ), Success(:var response) => response?.isNotEmpty == true diff --git a/lib/pages/video/reply/widgets/reply_item_grpc.dart b/lib/pages/video/reply/widgets/reply_item_grpc.dart index ecce19894..c990d4962 100644 --- a/lib/pages/video/reply/widgets/reply_item_grpc.dart +++ b/lib/pages/video/reply/widgets/reply_item_grpc.dart @@ -1028,12 +1028,19 @@ class ReplyItemGrpc extends StatelessWidget { context: context, builder: (context) { return Dialog( + constraints: const BoxConstraints( + minWidth: 280, + maxWidth: 425, + ), child: Padding( padding: const EdgeInsets.symmetric( horizontal: 20, vertical: 16, ), - child: SelectableText(message), + child: SelectableText( + message, + style: const TextStyle(fontSize: 15, height: 1.7), + ), ), ); }, diff --git a/lib/pages/video/widgets/header_control.dart b/lib/pages/video/widgets/header_control.dart index a0a7e807d..8e227d572 100644 --- a/lib/pages/video/widgets/header_control.dart +++ b/lib/pages/video/widgets/header_control.dart @@ -62,6 +62,7 @@ import 'package:material_design_icons_flutter/material_design_icons_flutter.dart mixin TimeBatteryMixin on State { PlPlayerController get plPlayerController; + late final titleKey = GlobalKey(); ContextSingleTicker? provider; ContextSingleTicker get effectiveProvider => provider ??= ContextSingleTicker( context, @@ -1422,7 +1423,10 @@ class HeaderControlState extends State return AlertDialog( title: const Text('播放信息'), contentPadding: const EdgeInsets.only(top: 16), - constraints: const BoxConstraints(maxWidth: 425), + constraints: const BoxConstraints( + minWidth: 280, + maxWidth: 425, + ), content: Material( type: MaterialType.transparency, child: ListTileTheme( @@ -2417,7 +2421,6 @@ class HeaderControlState extends State ); } - late final _titleKey = GlobalKey(); late final isFileSource = videoDetailCtr.isFileSource; @override @@ -2452,7 +2455,7 @@ class HeaderControlState extends State videoDetail.title!; } return MarqueeText( - key: _titleKey, + key: titleKey, title, spacing: 30, velocity: 30,