From 0264a4c01f487904527c6f4d6af9512b95db7a10 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Thu, 26 Jun 2025 10:57:31 +0800 Subject: [PATCH] opt text Signed-off-by: bggRGjQaUbCoE --- lib/common/widgets/text/paragraph.dart | 25 +++++++++++++------ .../video/reply/widgets/reply_item_grpc.dart | 24 ++++-------------- 2 files changed, 23 insertions(+), 26 deletions(-) diff --git a/lib/common/widgets/text/paragraph.dart b/lib/common/widgets/text/paragraph.dart index fc057e96..4cd1562d 100644 --- a/lib/common/widgets/text/paragraph.dart +++ b/lib/common/widgets/text/paragraph.dart @@ -78,7 +78,10 @@ class RenderParagraph extends RenderBox SelectionRegistrar? registrar, required Color primary, }) : assert(text.debugAssertIsValid()), - assert(maxLines == null || maxLines > 0), + assert(maxLines == null || + (maxLines > 0 && + overflow != TextOverflow.ellipsis && + overflow != TextOverflow.fade)), assert( identical(textScaler, TextScaler.noScaling) || textScaleFactor == 1.0, 'textScaleFactor is deprecated and cannot be specified when textScaler is specified.', @@ -673,6 +676,8 @@ class RenderParagraph extends RenderBox ); TextPainter? _morePainter; + bool didOverflowHeight = false; + @override void performLayout() { _lastSelectableFragments?.forEach( @@ -690,7 +695,7 @@ class RenderParagraph extends RenderBox final Size textSize = _textPainter.size; size = constraints.constrain(textSize); - final bool didOverflowHeight = + didOverflowHeight = size.height < textSize.height || _textPainter.didExceedMaxLines; if (didOverflowHeight) { @@ -700,7 +705,10 @@ class RenderParagraph extends RenderBox textScaler: textScaler, locale: locale, )..layout(maxWidth: constraints.maxWidth); - size = Size(size.width, size.height + _morePainter!.height); + size = Size( + size.width, + constraints.constrainHeight(size.height + _morePainter!.height), + ); } final bool didOverflowWidth = size.width < textSize.width; @@ -764,10 +772,6 @@ class RenderParagraph extends RenderBox @override void paint(PaintingContext context, Offset offset) { - if (_needsClipping) { - _morePainter?.paint( - context.canvas, offset + Offset(0, _textPainter.height)); - } // Text alignment only triggers repaint so it's possible the text layout has // been invalidated but performLayout wasn't called at this point. Make sure // the TextPainter has a valid layout. @@ -812,6 +816,13 @@ class RenderParagraph extends RenderBox } context.canvas.restore(); } + + if (didOverflowHeight) { + _morePainter?.paint( + context.canvas, + offset + Offset(0, _textPainter.height), + ); + } } /// Returns the offset at which to paint the caret. diff --git a/lib/pages/video/reply/widgets/reply_item_grpc.dart b/lib/pages/video/reply/widgets/reply_item_grpc.dart index e66610c2..c84281e4 100644 --- a/lib/pages/video/reply/widgets/reply_item_grpc.dart +++ b/lib/pages/video/reply/widgets/reply_item_grpc.dart @@ -283,12 +283,7 @@ class ReplyItemGrpc extends StatelessWidget { ), const TextSpan(text: ' '), ], - buildContent( - context, - theme, - replyItem, - null, - ), + buildContent(context, theme, replyItem), ], ), ), @@ -519,12 +514,7 @@ class ReplyItemGrpc extends StatelessWidget { ? '' : ' ', ), - buildContent( - context, - theme, - childReply, - replyItem, - ), + buildContent(context, theme, childReply), ], ), ), @@ -575,11 +565,7 @@ class ReplyItemGrpc extends StatelessWidget { BuildContext context, ThemeData theme, ReplyInfo replyItem, - ReplyInfo? fReplyItem, ) { - // replyItem 当前回复内容 - // replyReply 查看二楼回复(回复详情)回调 - // fReplyItem 父级回复内容,用作二楼回复(回复详情)展示 final Content content = replyItem.content; final List spanChildren = []; @@ -625,7 +611,7 @@ class ReplyItemGrpc extends StatelessWidget { String matchStr = match[0]!; if (content.emotes.containsKey(matchStr)) { // 处理表情 - final int size = content.emotes[matchStr]!.size.toInt(); + final size = content.emotes[matchStr]!.size.toInt() * 20.0; spanChildren.add( WidgetSpan( child: NetworkImgLayer( @@ -633,8 +619,8 @@ class ReplyItemGrpc extends StatelessWidget { ? content.emotes[matchStr]?.gifUrl : content.emotes[matchStr]?.url, type: ImageType.emote, - width: size * 20, - height: size * 20, + width: size, + height: size, ), ), );