From ba372a101b4e20965d9298346d4ecbab470cedfa Mon Sep 17 00:00:00 2001 From: dom Date: Sun, 12 Apr 2026 20:01:54 +0800 Subject: [PATCH] opt avatar Signed-off-by: dom --- lib/common/widgets/extra_hittest_stack.dart | 94 +++++++++++++++++++ lib/common/widgets/pendant_avatar.dart | 3 +- lib/pages/search_panel/user/widgets/item.dart | 3 +- 3 files changed, 98 insertions(+), 2 deletions(-) create mode 100644 lib/common/widgets/extra_hittest_stack.dart diff --git a/lib/common/widgets/extra_hittest_stack.dart b/lib/common/widgets/extra_hittest_stack.dart new file mode 100644 index 000000000..47cadf5ca --- /dev/null +++ b/lib/common/widgets/extra_hittest_stack.dart @@ -0,0 +1,94 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart' + show RenderStack, BoxHitTestResult, BoxHitTestEntry; + +class ExtraHitTestStack extends Stack { + const ExtraHitTestStack({ + super.key, + super.alignment, + super.textDirection, + super.fit, + super.clipBehavior, + super.children, + }); + + @override + RenderExtraHitTestStack createRenderObject(BuildContext context) { + return RenderExtraHitTestStack( + alignment: alignment, + textDirection: textDirection ?? Directionality.maybeOf(context), + fit: fit, + clipBehavior: clipBehavior, + ); + } + + @override + void updateRenderObject( + BuildContext context, + RenderExtraHitTestStack renderObject, + ) { + renderObject + ..alignment = alignment + ..textDirection = textDirection ?? Directionality.maybeOf(context) + ..fit = fit + ..clipBehavior = clipBehavior; + } +} + +class RenderExtraHitTestStack extends RenderStack { + RenderExtraHitTestStack({ + super.children, + super.alignment, + super.textDirection, + super.fit, + super.clipBehavior, + }); + + @override + bool hitTest(BoxHitTestResult result, {required Offset position}) { + assert(() { + if (!hasSize) { + if (debugNeedsLayout) { + throw FlutterError.fromParts([ + ErrorSummary( + 'Cannot hit test a render box that has never been laid out.', + ), + describeForError( + 'The hitTest() method was called on this RenderBox', + ), + ErrorDescription( + "Unfortunately, this object's geometry is not known at this time, " + 'probably because it has never been laid out. ' + 'This means it cannot be accurately hit-tested.', + ), + ErrorHint( + 'If you are trying ' + 'to perform a hit test during the layout phase itself, make sure ' + "you only hit test nodes that have completed layout (e.g. the node's " + 'children, after their layout() method has been called).', + ), + ]); + } + throw FlutterError.fromParts([ + ErrorSummary('Cannot hit test a render box with no size.'), + describeForError('The hitTest() method was called on this RenderBox'), + ErrorDescription( + 'Although this node is not marked as needing layout, ' + 'its size is not set.', + ), + ErrorHint( + 'A RenderBox object must have an ' + 'explicit size before it can be hit-tested. Make sure ' + 'that the RenderBox in question sets its size during layout.', + ), + ]); + } + return true; + }()); + if (hitTestChildren(result, position: position) || hitTestSelf(position)) { + result.add(BoxHitTestEntry(this, position)); + return true; + } + return false; + } +} diff --git a/lib/common/widgets/pendant_avatar.dart b/lib/common/widgets/pendant_avatar.dart index 8c955755c..9589e381c 100644 --- a/lib/common/widgets/pendant_avatar.dart +++ b/lib/common/widgets/pendant_avatar.dart @@ -1,5 +1,6 @@ import 'package:PiliPlus/common/assets.dart'; import 'package:PiliPlus/common/style.dart'; +import 'package:PiliPlus/common/widgets/extra_hittest_stack.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/models/common/avatar_badge_type.dart'; import 'package:PiliPlus/models/common/image_type.dart'; @@ -82,7 +83,7 @@ class PendantAvatar extends StatelessWidget { child: avatar, ); } - Widget child = Stack( + Widget child = ExtraHitTestStack( clipBehavior: .none, alignment: .center, children: [ diff --git a/lib/pages/search_panel/user/widgets/item.dart b/lib/pages/search_panel/user/widgets/item.dart index e109e8532..97e0a86df 100644 --- a/lib/pages/search_panel/user/widgets/item.dart +++ b/lib/pages/search_panel/user/widgets/item.dart @@ -4,7 +4,8 @@ import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/num_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:get/get_core/src/get_main.dart'; +import 'package:get/get_navigation/src/extension_navigation.dart'; class SearchUserItem extends StatelessWidget { const SearchUserItem({