opt: btn, stack

Closes #775

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-04-29 21:53:20 +08:00
parent 4abffeed32
commit b4ca42e0c0
55 changed files with 243 additions and 158 deletions

View File

@@ -28,6 +28,7 @@ void imageSaveDialog({
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
Stack( Stack(
clipBehavior: Clip.none,
children: [ children: [
GestureDetector( GestureDetector(
onTap: SmartDialog.dismiss, onTap: SmartDialog.dismiss,

View File

@@ -138,6 +138,7 @@ Widget imageView(
} }
}, },
child: Stack( child: Stack(
clipBehavior: Clip.none,
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
ClipRRect( ClipRRect(

View File

@@ -276,6 +276,7 @@ class _InteractiveviewerGalleryState extends State<InteractiveviewerGallery>
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Stack( return Stack(
clipBehavior: Clip.none,
children: [ children: [
InteractiveViewerBoundary( InteractiveViewerBoundary(
controller: _transformationController, controller: _transformationController,
@@ -344,6 +345,7 @@ class _InteractiveviewerGalleryState extends State<InteractiveviewerGallery>
) )
: null, : null,
child: Stack( child: Stack(
clipBehavior: Clip.none,
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
Align( Align(

View File

@@ -172,6 +172,7 @@ class _NineGridViewState extends State<NineGridView> {
))); )));
} }
return Stack( return Stack(
clipBehavior: Clip.none,
children: list, children: list,
); );
} }
@@ -260,6 +261,7 @@ class _NineGridViewState extends State<NineGridView> {
))); )));
} }
return Stack( return Stack(
clipBehavior: Clip.none,
children: list, children: list,
); );
} }
@@ -286,6 +288,7 @@ class _NineGridViewState extends State<NineGridView> {
} }
return ClipOval( return ClipOval(
child: Stack( child: Stack(
clipBehavior: Clip.none,
children: children, children: children,
), ),
); );
@@ -372,7 +375,10 @@ class _NineGridViewState extends State<NineGridView> {
children.add(child); children.add(child);
} }
return Stack(children: children); return Stack(
clipBehavior: Clip.none,
children: children,
);
} }
/// double is zero. /// double is zero.

View File

@@ -598,6 +598,7 @@ class RefreshIndicatorState extends State<RefreshIndicator>
_mode == _RefreshIndicatorMode.done; _mode == _RefreshIndicatorMode.done;
return Stack( return Stack(
clipBehavior: Clip.none,
children: <Widget>[ children: <Widget>[
child, child,
if (_mode != null) if (_mode != null)

View File

@@ -32,6 +32,7 @@ class VideoCardHGrpc extends StatelessWidget {
String type = 'video'; String type = 'video';
final String heroTag = Utils.makeHeroTag(aid); final String heroTag = Utils.makeHeroTag(aid);
return Stack( return Stack(
clipBehavior: Clip.none,
children: [ children: [
Semantics( Semantics(
excludeSemantics: true, excludeSemantics: true,
@@ -66,6 +67,7 @@ class VideoCardHGrpc extends StatelessWidget {
final double maxWidth = boxConstraints.maxWidth; final double maxWidth = boxConstraints.maxWidth;
final double maxHeight = boxConstraints.maxHeight; final double maxHeight = boxConstraints.maxHeight;
return Stack( return Stack(
clipBehavior: Clip.none,
children: [ children: [
Hero( Hero(
tag: heroTag, tag: heroTag,

View File

@@ -28,6 +28,7 @@ class VideoCardHMemberVideo extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Stack( return Stack(
clipBehavior: Clip.none,
children: [ children: [
InkWell( InkWell(
onLongPress: () => imageSaveDialog( onLongPress: () => imageSaveDialog(
@@ -77,6 +78,7 @@ class VideoCardHMemberVideo extends StatelessWidget {
final double maxWidth = boxConstraints.maxWidth; final double maxWidth = boxConstraints.maxWidth;
final double maxHeight = boxConstraints.maxHeight; final double maxHeight = boxConstraints.maxHeight;
return Stack( return Stack(
clipBehavior: Clip.none,
children: [ children: [
NetworkImgLayer( NetworkImgLayer(
src: videoItem.cover, src: videoItem.cover,

View File

@@ -90,64 +90,68 @@ class VideoCardV extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Stack(children: [ return Stack(
Semantics( clipBehavior: Clip.none,
label: Utils.videoItemSemantics(videoItem), children: [
excludeSemantics: true, Semantics(
child: Card( label: Utils.videoItemSemantics(videoItem),
clipBehavior: Clip.hardEdge, excludeSemantics: true,
margin: EdgeInsets.zero, child: Card(
child: InkWell( clipBehavior: Clip.hardEdge,
onTap: () => onPushDetail(Utils.makeHeroTag(videoItem.aid)), margin: EdgeInsets.zero,
onLongPress: () => imageSaveDialog( child: InkWell(
title: videoItem.title, onTap: () => onPushDetail(Utils.makeHeroTag(videoItem.aid)),
cover: videoItem.pic, onLongPress: () => imageSaveDialog(
), title: videoItem.title,
child: Column( cover: videoItem.pic,
crossAxisAlignment: CrossAxisAlignment.start, ),
children: [ child: Column(
AspectRatio( crossAxisAlignment: CrossAxisAlignment.start,
aspectRatio: StyleString.aspectRatio, children: [
child: LayoutBuilder(builder: (context, boxConstraints) { AspectRatio(
double maxWidth = boxConstraints.maxWidth; aspectRatio: StyleString.aspectRatio,
double maxHeight = boxConstraints.maxHeight; child: LayoutBuilder(builder: (context, boxConstraints) {
return Stack( double maxWidth = boxConstraints.maxWidth;
children: [ double maxHeight = boxConstraints.maxHeight;
NetworkImgLayer( return Stack(
src: videoItem.pic, clipBehavior: Clip.none,
width: maxWidth, children: [
height: maxHeight, NetworkImgLayer(
), src: videoItem.pic,
if (videoItem.duration > 0) width: maxWidth,
PBadge( height: maxHeight,
bottom: 6, ),
right: 7, if (videoItem.duration > 0)
size: 'small', PBadge(
type: 'gray', bottom: 6,
text: Utils.timeFormat(videoItem.duration), right: 7,
) size: 'small',
], type: 'gray',
); text: Utils.timeFormat(videoItem.duration),
}), )
), ],
videoContent(context) );
], }),
),
videoContent(context)
],
),
), ),
), ),
), ),
), if (videoItem.goto == 'av')
if (videoItem.goto == 'av') Positioned(
Positioned( right: -5,
right: -5, bottom: -2,
bottom: -2, child: VideoPopupMenu(
child: VideoPopupMenu( size: 29,
size: 29, iconSize: 17,
iconSize: 17, videoItem: videoItem,
videoItem: videoItem, onRemove: onRemove,
onRemove: onRemove, ),
), ),
), ],
]); );
} }
Widget videoContent(context) { Widget videoContent(context) {

View File

@@ -55,6 +55,7 @@ class VideoCardVMemberHome extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Stack( return Stack(
clipBehavior: Clip.none,
children: [ children: [
Semantics( Semantics(
excludeSemantics: true, excludeSemantics: true,
@@ -77,6 +78,7 @@ class VideoCardVMemberHome extends StatelessWidget {
double maxWidth = boxConstraints.maxWidth; double maxWidth = boxConstraints.maxWidth;
double maxHeight = boxConstraints.maxHeight; double maxHeight = boxConstraints.maxHeight;
return Stack( return Stack(
clipBehavior: Clip.none,
children: [ children: [
NetworkImgLayer( NetworkImgLayer(
src: videoItem.cover, src: videoItem.cover,

View File

@@ -34,6 +34,7 @@ class VideoCustomActions {
videoItem.bvid!, videoItem.bvid!,
'copy', 'copy',
Stack( Stack(
clipBehavior: Clip.none,
children: [ children: [
Icon(MdiIcons.identifier, size: 16), Icon(MdiIcons.identifier, size: 16),
Icon(MdiIcons.circleOutline, size: 16), Icon(MdiIcons.circleOutline, size: 16),

View File

@@ -232,6 +232,7 @@ class _ArticlePageState extends State<ArticlePage>
resizeToAvoidBottomInset: false, resizeToAvoidBottomInset: false,
appBar: _buildAppBar, appBar: _buildAppBar,
body: Stack( body: Stack(
clipBehavior: Clip.none,
children: [ children: [
SafeArea( SafeArea(
top: false, top: false,

View File

@@ -198,6 +198,7 @@ class _BangumiInfoState extends State<BangumiInfo> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Stack( Stack(
clipBehavior: Clip.none,
children: [ children: [
GestureDetector( GestureDetector(
onTap: () { onTap: () {

View File

@@ -41,6 +41,7 @@ class BangumiCardV extends StatelessWidget {
final double maxWidth = boxConstraints.maxWidth; final double maxWidth = boxConstraints.maxWidth;
final double maxHeight = boxConstraints.maxHeight; final double maxHeight = boxConstraints.maxHeight;
return Stack( return Stack(
clipBehavior: Clip.none,
children: [ children: [
Hero( Hero(
tag: heroTag, tag: heroTag,

View File

@@ -46,6 +46,7 @@ class BangumiCardVMemberHome extends StatelessWidget {
final double maxWidth = boxConstraints.maxWidth; final double maxWidth = boxConstraints.maxWidth;
final double maxHeight = boxConstraints.maxHeight; final double maxHeight = boxConstraints.maxHeight;
return Stack( return Stack(
clipBehavior: Clip.none,
children: [ children: [
Hero( Hero(
tag: heroTag, tag: heroTag,

View File

@@ -38,6 +38,7 @@ class BangumiCardVPgcIndex extends StatelessWidget {
final double maxWidth = boxConstraints.maxWidth; final double maxWidth = boxConstraints.maxWidth;
final double maxHeight = boxConstraints.maxHeight; final double maxHeight = boxConstraints.maxHeight;
return Stack( return Stack(
clipBehavior: Clip.none,
children: [ children: [
NetworkImgLayer( NetworkImgLayer(
src: bangumiItem['cover'], src: bangumiItem['cover'],

View File

@@ -39,6 +39,7 @@ class BangumiCardVSearch extends StatelessWidget {
final double maxWidth = boxConstraints.maxWidth; final double maxWidth = boxConstraints.maxWidth;
final double maxHeight = boxConstraints.maxHeight; final double maxHeight = boxConstraints.maxHeight;
return Stack( return Stack(
clipBehavior: Clip.none,
children: [ children: [
NetworkImgLayer( NetworkImgLayer(
src: item.cover, src: item.cover,

View File

@@ -39,6 +39,7 @@ class BangumiCardVTimeline extends StatelessWidget {
final double maxWidth = boxConstraints.maxWidth; final double maxWidth = boxConstraints.maxWidth;
final double maxHeight = boxConstraints.maxHeight; final double maxHeight = boxConstraints.maxHeight;
return Stack( return Stack(
clipBehavior: Clip.none,
children: [ children: [
NetworkImgLayer( NetworkImgLayer(
src: item.cover, src: item.cover,

View File

@@ -286,6 +286,7 @@ abstract class CommonPublishPageState<T extends CommonPublishPage>
} }
return Stack( return Stack(
clipBehavior: Clip.none,
children: [ children: [
GestureDetector( GestureDetector(
onTap: () { onTap: () {

View File

@@ -135,6 +135,7 @@ class _CreateDynPanelState extends CommonPublishPageState<CreateDynPanel> {
child: Padding( child: Padding(
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(16),
child: Stack( child: Stack(
clipBehavior: Clip.none,
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
Align( Align(

View File

@@ -362,6 +362,7 @@ class _DynamicDetailPageState extends State<DynamicDetailPage>
} }
Widget _buildBody(Orientation orientation, ThemeData theme) => Stack( Widget _buildBody(Orientation orientation, ThemeData theme) => Stack(
clipBehavior: Clip.none,
children: [ children: [
Builder( Builder(
builder: (context) { builder: (context) {

View File

@@ -246,6 +246,7 @@ class _RepostPanelState extends CommonPublishPageState<RepostPanel> {
height: 34, height: 34,
padding: const EdgeInsets.symmetric(horizontal: 16), padding: const EdgeInsets.symmetric(horizontal: 16),
child: Stack( child: Stack(
clipBehavior: Clip.none,
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
Align( Align(

View File

@@ -65,6 +65,7 @@ class AuthorPanel extends StatelessWidget {
: Utils.dateFormat(item.modules.moduleAuthor!.pubTs) : Utils.dateFormat(item.modules.moduleAuthor!.pubTs)
: item.modules.moduleAuthor?.pubTime; : item.modules.moduleAuthor?.pubTime;
return Stack( return Stack(
clipBehavior: Clip.none,
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
Align( Align(
@@ -382,6 +383,7 @@ class AuthorPanel extends StatelessWidget {
}, },
minLeadingWidth: 0, minLeadingWidth: 0,
leading: const Stack( leading: const Stack(
clipBehavior: Clip.none,
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
Icon(Icons.shield_outlined, size: 19), Icon(Icons.shield_outlined, size: 19),

View File

@@ -441,6 +441,7 @@ Widget forWard(
children: [ children: [
if (floor == 1) const SizedBox(width: 12), if (floor == 1) const SizedBox(width: 12),
Stack( Stack(
clipBehavior: Clip.none,
children: [ children: [
Hero( Hero(
tag: item.modules.moduleDynamic!.major!.medialist!['cover'], tag: item.modules.moduleDynamic!.major!.medialist!['cover'],

View File

@@ -79,6 +79,7 @@ Widget liveRcmdPanel(
builder: (context, box) { builder: (context, box) {
double width = box.maxWidth; double width = box.maxWidth;
return Stack( return Stack(
clipBehavior: Clip.none,
children: [ children: [
Hero( Hero(
tag: liveRcmd.roomId.toString(), tag: liveRcmd.roomId.toString(),

View File

@@ -64,6 +64,7 @@ Widget videoSeasonWidget(
builder: (context, box) { builder: (context, box) {
double width = box.maxWidth; double width = box.maxWidth;
return Stack( return Stack(
clipBehavior: Clip.none,
children: [ children: [
NetworkImgLayer( NetworkImgLayer(
width: width, width: width,

View File

@@ -114,7 +114,7 @@ class FavArticleItem extends StatelessWidget {
), ),
Positioned( Positioned(
right: 12, right: 12,
bottom: 0, bottom: -6,
child: iconButton( child: iconButton(
iconSize: 18, iconSize: 18,
context: context, context: context,

View File

@@ -451,6 +451,7 @@ class _FavDetailPageState extends State<FavDetailPage> {
} }
FavDetailItemData item = loadingState.response![index]; FavDetailItemData item = loadingState.response![index];
return Stack( return Stack(
clipBehavior: Clip.none,
children: [ children: [
Positioned.fill( Positioned.fill(
child: FavVideoCardH( child: FavVideoCardH(

View File

@@ -96,6 +96,7 @@ class FavVideoCardH extends StatelessWidget {
double maxWidth = boxConstraints.maxWidth; double maxWidth = boxConstraints.maxWidth;
double maxHeight = boxConstraints.maxHeight; double maxHeight = boxConstraints.maxHeight;
return Stack( return Stack(
clipBehavior: Clip.none,
children: [ children: [
NetworkImgLayer( NetworkImgLayer(
src: videoItem.pic, src: videoItem.pic,
@@ -132,6 +133,7 @@ class FavVideoCardH extends StatelessWidget {
final theme = Theme.of(context); final theme = Theme.of(context);
return Expanded( return Expanded(
child: Stack( child: Stack(
clipBehavior: Clip.none,
children: [ children: [
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@@ -179,7 +181,7 @@ class FavVideoCardH extends StatelessWidget {
if (onDelFav != null) if (onDelFav != null)
Positioned( Positioned(
right: 0, right: 0,
bottom: 0, bottom: -8,
child: iconButton( child: iconButton(
context: context, context: context,
icon: Icons.clear, icon: Icons.clear,

View File

@@ -118,6 +118,7 @@ class HistoryItem extends StatelessWidget {
); );
}, },
child: Stack( child: Stack(
clipBehavior: Clip.none,
children: [ children: [
Padding( Padding(
padding: const EdgeInsets.symmetric( padding: const EdgeInsets.symmetric(
@@ -128,110 +129,105 @@ class HistoryItem extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Stack( AspectRatio(
clipBehavior: Clip.none, aspectRatio: StyleString.aspectRatio,
children: [ child: LayoutBuilder(
AspectRatio( builder: (context, boxConstraints) {
aspectRatio: StyleString.aspectRatio, double maxWidth = boxConstraints.maxWidth;
child: LayoutBuilder( double maxHeight = boxConstraints.maxHeight;
builder: (context, boxConstraints) { return Stack(
double maxWidth = boxConstraints.maxWidth; clipBehavior: Clip.none,
double maxHeight = boxConstraints.maxHeight; children: [
return Stack( NetworkImgLayer(
clipBehavior: Clip.none, src: (videoItem.cover.isNullOrEmpty
children: [ ? videoItem.covers?.firstOrNull ?? ''
NetworkImgLayer( : videoItem.cover),
src: (videoItem.cover.isNullOrEmpty width: maxWidth,
? videoItem.covers?.firstOrNull ?? '' height: maxHeight,
: videoItem.cover),
width: maxWidth,
height: maxHeight,
),
if (!BusinessType
.hiddenDurationType.hiddenDurationType
.contains(videoItem.history.business))
PBadge(
text: videoItem.progress == -1
? '已看完'
: '${Utils.timeFormat(videoItem.progress)}/${Utils.timeFormat(videoItem.duration!)}',
right: 6.0,
bottom: 8.0,
type: 'gray',
),
// 右上角
if (BusinessType.showBadge.showBadge
.contains(videoItem.history.business) ||
videoItem.history.business ==
BusinessType.live.type)
PBadge(
text: videoItem.badge,
top: 6.0,
right: 6.0,
bottom: null,
left: null,
),
],
);
},
),
),
Positioned.fill(
child: AnimatedOpacity(
opacity: videoItem.checked == true ? 1 : 0,
duration: const Duration(milliseconds: 200),
child: Container(
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius: StyleString.mdRadius,
color: Colors.black.withOpacity(0.6),
), ),
child: SizedBox( if (!BusinessType
width: 34, .hiddenDurationType.hiddenDurationType
height: 34, .contains(videoItem.history.business))
child: AnimatedScale( PBadge(
scale: videoItem.checked == true ? 1 : 0, text: videoItem.progress == -1
duration: const Duration(milliseconds: 250), ? '已看完'
curve: Curves.easeInOut, : '${Utils.timeFormat(videoItem.progress)}/${Utils.timeFormat(videoItem.duration!)}',
child: IconButton( right: 6.0,
tooltip: '取消选择', bottom: 8.0,
style: ButtonStyle( type: 'gray',
padding: ),
WidgetStateProperty.all(EdgeInsets.zero), // 右上角
backgroundColor: if (BusinessType.showBadge.showBadge
WidgetStateProperty.resolveWith( .contains(videoItem.history.business) ||
(states) { videoItem.history.business ==
return theme.colorScheme.surface BusinessType.live.type)
.withOpacity(0.8); PBadge(
}, text: videoItem.badge,
top: 6.0,
right: 6.0,
bottom: null,
left: null,
),
if (videoItem.duration != null &&
videoItem.duration != 0 &&
videoItem.progress != null &&
videoItem.progress != 0)
Positioned(
left: 0,
right: 0,
bottom: 0,
child: videoProgressIndicator(
videoItem.progress == -1
? 1
: videoItem.progress! / videoItem.duration!,
),
),
Positioned.fill(
child: AnimatedOpacity(
opacity: videoItem.checked == true ? 1 : 0,
duration: const Duration(milliseconds: 200),
child: Container(
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius: StyleString.mdRadius,
color: Colors.black.withOpacity(0.6),
),
child: SizedBox(
width: 34,
height: 34,
child: AnimatedScale(
scale: videoItem.checked == true ? 1 : 0,
duration: const Duration(milliseconds: 250),
curve: Curves.easeInOut,
child: IconButton(
tooltip: '取消选择',
style: ButtonStyle(
padding: WidgetStateProperty.all(
EdgeInsets.zero),
backgroundColor:
WidgetStateProperty.resolveWith(
(states) {
return theme.colorScheme.surface
.withOpacity(0.8);
},
),
),
onPressed: () {
feedBack();
onChoose?.call();
},
icon: Icon(Icons.done_all_outlined,
color: theme.colorScheme.primary),
),
), ),
), ),
onPressed: () {
feedBack();
onChoose?.call();
},
icon: Icon(Icons.done_all_outlined,
color: theme.colorScheme.primary),
), ),
), ),
), ),
), ],
), );
), },
if (videoItem.duration != null && ),
videoItem.duration != 0 &&
videoItem.progress != null &&
videoItem.progress != 0)
Positioned(
left: 0,
right: 0,
bottom: 0,
child: videoProgressIndicator(
videoItem.progress == -1
? 1
: videoItem.progress! / videoItem.duration!,
),
),
],
), ),
const SizedBox(width: 10), const SizedBox(width: 10),
videoContent(theme), videoContent(theme),
@@ -240,7 +236,7 @@ class HistoryItem extends StatelessWidget {
), ),
Positioned( Positioned(
right: 12, right: 12,
bottom: 12, bottom: 0,
child: SizedBox( child: SizedBox(
width: 29, width: 29,
height: 29, height: 29,
@@ -339,6 +335,8 @@ class HistoryItem extends StatelessWidget {
if (videoItem.authorName != '') if (videoItem.authorName != '')
Text( Text(
videoItem.authorName!, videoItem.authorName!,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle( style: TextStyle(
fontSize: theme.textTheme.labelMedium!.fontSize, fontSize: theme.textTheme.labelMedium!.fontSize,
color: theme.colorScheme.outline, color: theme.colorScheme.outline,

View File

@@ -82,6 +82,7 @@ class _LaterViewChildPageState extends State<LaterViewChildPage>
} }
var videoItem = loadingState.response![index]; var videoItem = loadingState.response![index];
return Stack( return Stack(
clipBehavior: Clip.none,
children: [ children: [
VideoCardH( VideoCardH(
videoItem: videoItem, videoItem: videoItem,

View File

@@ -41,6 +41,7 @@ class _LaterSearchPageState
} }
final item = list[index]; final item = list[index];
return Stack( return Stack(
clipBehavior: Clip.none,
children: [ children: [
VideoCardH( VideoCardH(
videoItem: item, videoItem: item,

View File

@@ -39,6 +39,7 @@ class LiveCardV extends StatelessWidget {
double maxWidth = boxConstraints.maxWidth; double maxWidth = boxConstraints.maxWidth;
double maxHeight = boxConstraints.maxHeight; double maxHeight = boxConstraints.maxHeight;
return Stack( return Stack(
clipBehavior: Clip.none,
children: [ children: [
Hero( Hero(
tag: heroTag, tag: heroTag,

View File

@@ -39,6 +39,7 @@ class LiveCardVFollow extends StatelessWidget {
double maxWidth = boxConstraints.maxWidth; double maxWidth = boxConstraints.maxWidth;
double maxHeight = boxConstraints.maxHeight; double maxHeight = boxConstraints.maxHeight;
return Stack( return Stack(
clipBehavior: Clip.none,
children: [ children: [
Hero( Hero(
tag: heroTag, tag: heroTag,

View File

@@ -214,6 +214,7 @@ class _LiveRoomPageState extends State<LiveRoomPage>
return ColoredBox( return ColoredBox(
color: Colors.black, color: Colors.black,
child: Stack( child: Stack(
clipBehavior: Clip.none,
children: [ children: [
Obx( Obx(
() => isFullScreen () => isFullScreen
@@ -281,6 +282,7 @@ class _LiveRoomPageState extends State<LiveRoomPage>
resizeToAvoidBottomInset: false, resizeToAvoidBottomInset: false,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
body: Stack( body: Stack(
clipBehavior: Clip.none,
children: [ children: [
_buildAppBar, _buildAppBar,
Column( Column(

View File

@@ -22,6 +22,7 @@ class LiveRoomChat extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Stack( return Stack(
clipBehavior: Clip.none,
children: [ children: [
Obx( Obx(
() => ListView.separated( () => ListView.separated(

View File

@@ -40,6 +40,7 @@ class SeasonSeriesCard extends StatelessWidget {
final double maxWidth = boxConstraints.maxWidth; final double maxWidth = boxConstraints.maxWidth;
final double maxHeight = boxConstraints.maxHeight; final double maxHeight = boxConstraints.maxHeight;
return Stack( return Stack(
clipBehavior: Clip.none,
children: [ children: [
NetworkImgLayer( NetworkImgLayer(
src: item['meta']['cover'], src: item['meta']['cover'],

View File

@@ -441,6 +441,7 @@ class UserInfoCard extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Stack( Stack(
clipBehavior: Clip.none,
children: [ children: [
Column( Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,

View File

@@ -47,6 +47,7 @@ class MemberCoinsItem extends StatelessWidget {
double maxWidth = boxConstraints.maxWidth; double maxWidth = boxConstraints.maxWidth;
double maxHeight = boxConstraints.maxHeight; double maxHeight = boxConstraints.maxHeight;
return Stack( return Stack(
clipBehavior: Clip.none,
children: [ children: [
NetworkImgLayer( NetworkImgLayer(
src: coinItem.pic, src: coinItem.pic,

View File

@@ -171,6 +171,7 @@ class _LikeMePageState extends State<LikeMePage> {
width: 50, width: 50,
height: 50, height: 50,
child: Stack( child: Stack(
clipBehavior: Clip.none,
children: [ children: [
for (var j = 0; for (var j = 0;
j < item.users!.length && j < 4; j < item.users!.length && j < 4;

View File

@@ -35,6 +35,7 @@ class LiveItem extends StatelessWidget {
double maxWidth = boxConstraints.maxWidth; double maxWidth = boxConstraints.maxWidth;
double maxHeight = boxConstraints.maxHeight; double maxHeight = boxConstraints.maxHeight;
return Stack( return Stack(
clipBehavior: Clip.none,
children: [ children: [
NetworkImgLayer( NetworkImgLayer(
src: liveItem.cover, src: liveItem.cover,

View File

@@ -36,6 +36,7 @@ class SearchPgcItem extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Stack( Stack(
clipBehavior: Clip.none,
children: [ children: [
NetworkImgLayer( NetworkImgLayer(
width: 111, width: 111,

View File

@@ -1509,6 +1509,7 @@ List<SettingsModel> get extraSettings => [
defaultVal: false, defaultVal: false,
onTap: () => Get.toNamed('/sponsorBlock'), onTap: () => Get.toNamed('/sponsorBlock'),
leading: const Stack( leading: const Stack(
clipBehavior: Clip.none,
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
Icon(Icons.shield_outlined), Icon(Icons.shield_outlined),
@@ -2063,6 +2064,7 @@ List<SettingsModel> get extraSettings => [
title: '发评反诈', title: '发评反诈',
subtitle: '发送评论后检查评论是否可见', subtitle: '发送评论后检查评论是否可见',
leading: const Stack( leading: const Stack(
clipBehavior: Clip.none,
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
Icon(Icons.shield_outlined), Icon(Icons.shield_outlined),
@@ -2088,6 +2090,7 @@ List<SettingsModel> get extraSettings => [
title: '发布/转发动态反诈', title: '发布/转发动态反诈',
subtitle: '发布/转发动态后检查动态是否可见', subtitle: '发布/转发动态后检查动态是否可见',
leading: const Stack( leading: const Stack(
clipBehavior: Clip.none,
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
Icon(Icons.shield_outlined), Icon(Icons.shield_outlined),
@@ -2101,6 +2104,7 @@ List<SettingsModel> get extraSettings => [
settingsType: SettingsType.sw1tch, settingsType: SettingsType.sw1tch,
title: '屏蔽带货动态', title: '屏蔽带货动态',
leading: const Stack( leading: const Stack(
clipBehavior: Clip.none,
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
Icon(Icons.shopping_bag_outlined, size: 14), Icon(Icons.shopping_bag_outlined, size: 14),
@@ -2117,6 +2121,7 @@ List<SettingsModel> get extraSettings => [
settingsType: SettingsType.sw1tch, settingsType: SettingsType.sw1tch,
title: '屏蔽带货评论', title: '屏蔽带货评论',
leading: const Stack( leading: const Stack(
clipBehavior: Clip.none,
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
Icon(Icons.shopping_bag_outlined, size: 14), Icon(Icons.shopping_bag_outlined, size: 14),

View File

@@ -75,6 +75,7 @@ class SubItem extends StatelessWidget {
: '其它:${subFolderItem.type}'; : '其它:${subFolderItem.type}';
return Expanded( return Expanded(
child: Stack( child: Stack(
clipBehavior: Clip.none,
children: [ children: [
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,

View File

@@ -57,6 +57,7 @@ class SubVideoCardH extends StatelessWidget {
double maxWidth = boxConstraints.maxWidth; double maxWidth = boxConstraints.maxWidth;
double maxHeight = boxConstraints.maxHeight; double maxHeight = boxConstraints.maxHeight;
return Stack( return Stack(
clipBehavior: Clip.none,
children: [ children: [
NetworkImgLayer( NetworkImgLayer(
src: videoItem.cover, src: videoItem.cover,
@@ -85,6 +86,7 @@ class SubVideoCardH extends StatelessWidget {
Widget videoContent(context) { Widget videoContent(context) {
return Expanded( return Expanded(
child: Stack( child: Stack(
clipBehavior: Clip.none,
children: [ children: [
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,

View File

@@ -193,6 +193,7 @@ class _PayCoinsPageState extends State<PayCoinsPage>
Widget _buildBody(isV) => Stack( Widget _buildBody(isV) => Stack(
key: _key, key: _key,
clipBehavior: Clip.none,
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
Visibility( Visibility(
@@ -268,6 +269,7 @@ class _PayCoinsPageState extends State<PayCoinsPage>
BlendMode.srcATop, BlendMode.srcATop,
), ),
child: Stack( child: Stack(
clipBehavior: Clip.none,
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
SlideTransition( SlideTransition(
@@ -389,6 +391,7 @@ class _PayCoinsPageState extends State<PayCoinsPage>
], ],
const SizedBox(height: 10), const SizedBox(height: 10),
Stack( Stack(
clipBehavior: Clip.none,
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
children: [ children: [
GestureDetector( GestureDetector(

View File

@@ -150,6 +150,7 @@ class _VideoInfoState extends State<VideoInfo> {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
Stack( Stack(
clipBehavior: Clip.none,
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
Icon( Icon(
@@ -548,6 +549,7 @@ class _VideoInfoState extends State<VideoInfo> {
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
Stack( Stack(
clipBehavior: Clip.none,
children: [ children: [
Row( Row(
children: [ children: [

View File

@@ -157,6 +157,7 @@ class ActionItemState extends State<ActionItem>
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Stack( Stack(
clipBehavior: Clip.none,
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
if (widget.needAnim && !_hideCircle) if (widget.needAnim && !_hideCircle)

View File

@@ -96,6 +96,7 @@ class _PostPanelState extends CommonCollapseSlidePageState<PostPanel> {
Widget buildList(ThemeData theme) { Widget buildList(ThemeData theme) {
return list?.isNotEmpty == true return list?.isNotEmpty == true
? Stack( ? Stack(
clipBehavior: Clip.none,
children: [ children: [
SingleChildScrollView( SingleChildScrollView(
controller: ScrollController(), controller: ScrollController(),

View File

@@ -104,6 +104,7 @@ class _VideoReplyPanelState extends State<VideoReplyPanel>
await _videoReplyController.onRefresh(); await _videoReplyController.onRefresh();
}, },
child: Stack( child: Stack(
clipBehavior: Clip.none,
children: [ children: [
CustomScrollView( CustomScrollView(
controller: widget.needController == false controller: widget.needController == false

View File

@@ -111,6 +111,7 @@ class ReplyItemGrpc extends StatelessWidget {
top: 8, top: 8,
right: 12, right: 12,
child: Stack( child: Stack(
clipBehavior: Clip.none,
alignment: Alignment.centerRight, alignment: Alignment.centerRight,
children: [ children: [
CachedNetworkImage( CachedNetworkImage(
@@ -1179,6 +1180,7 @@ class ReplyItemGrpc extends StatelessWidget {
onTap: () => menuActionHandler('checkReply'), onTap: () => menuActionHandler('checkReply'),
minLeadingWidth: 0, minLeadingWidth: 0,
leading: Stack( leading: Stack(
clipBehavior: Clip.none,
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
const Icon(Icons.shield_outlined, size: 19), const Icon(Icons.shield_outlined, size: 19),

View File

@@ -165,6 +165,7 @@ class _VideoReplyReplyPanelState
}, },
child: Obx( child: Obx(
() => Stack( () => Stack(
clipBehavior: Clip.none,
children: [ children: [
ScrollablePositionedList.builder( ScrollablePositionedList.builder(
key: _listKey, key: _listKey,

View File

@@ -552,6 +552,7 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
videoDetailController.scrollCtr.offset != 0 && videoDetailController.scrollCtr.offset != 0 &&
context.orientation == Orientation.portrait; context.orientation == Orientation.portrait;
return Stack( return Stack(
clipBehavior: Clip.none,
children: [ children: [
AppBar( AppBar(
backgroundColor: Colors.black, backgroundColor: Colors.black,
@@ -639,6 +640,7 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
? animHeight ? animHeight
: videoDetailController.videoHeight, : videoDetailController.videoHeight,
flexibleSpace: Stack( flexibleSpace: Stack(
clipBehavior: Clip.none,
children: [ children: [
Builder( Builder(
builder: (context) { builder: (context) {
@@ -702,6 +704,7 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
child: SizedBox( child: SizedBox(
height: kToolbarHeight, height: kToolbarHeight,
child: Stack( child: Stack(
clipBehavior: Clip.none,
children: [ children: [
Align( Align(
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
@@ -1182,6 +1185,7 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
); );
Widget get childWhenDisabledLandscape => Stack( Widget get childWhenDisabledLandscape => Stack(
clipBehavior: Clip.none,
children: [ children: [
Scaffold( Scaffold(
resizeToAvoidBottomInset: false, resizeToAvoidBottomInset: false,
@@ -1261,6 +1265,7 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
() => Visibility( () => Visibility(
visible: videoDetailController.isShowCover.value, visible: videoDetailController.isShowCover.value,
child: Stack( child: Stack(
clipBehavior: Clip.none,
children: [ children: [
Positioned( Positioned(
top: 0, top: 0,
@@ -1634,6 +1639,7 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
MediaQuery.of(context).orientation == Orientation.portrait), MediaQuery.of(context).orientation == Orientation.portrait),
onPopInvokedWithResult: _onPopInvokedWithResult, onPopInvokedWithResult: _onPopInvokedWithResult,
child: Stack( child: Stack(
clipBehavior: Clip.none,
children: [ children: [
Positioned.fill(child: ColoredBox(color: Colors.black)), Positioned.fill(child: ColoredBox(color: Colors.black)),
@@ -1860,6 +1866,7 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
); );
if (videoDetailController.isPlayAll) { if (videoDetailController.isPlayAll) {
return Stack( return Stack(
clipBehavior: Clip.none,
children: [ children: [
introPanel(), introPanel(),
Positioned( Positioned(

View File

@@ -2032,6 +2032,7 @@ class HeaderControlState extends State<HeaderControl> {
), ),
onPressed: () => videoDetailCtr.onBlock(context), onPressed: () => videoDetailCtr.onBlock(context),
icon: Stack( icon: Stack(
clipBehavior: Clip.none,
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
Icon( Icon(

View File

@@ -179,6 +179,7 @@ class _MediaListPanelState
); );
}, },
child: Stack( child: Stack(
clipBehavior: Clip.none,
children: [ children: [
Padding( Padding(
padding: const EdgeInsets.symmetric( padding: const EdgeInsets.symmetric(
@@ -194,6 +195,7 @@ class _MediaListPanelState
child: LayoutBuilder( child: LayoutBuilder(
builder: (context, boxConstraints) { builder: (context, boxConstraints) {
return Stack( return Stack(
clipBehavior: Clip.none,
children: [ children: [
NetworkImgLayer( NetworkImgLayer(
src: item.cover, src: item.cover,
@@ -233,6 +235,8 @@ class _MediaListPanelState
const Spacer(), const Spacer(),
Text( Text(
item.upper!.name!, item.upper!.name!,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle( style: TextStyle(
fontSize: 12, fontSize: 12,
color: theme.colorScheme.outline, color: theme.colorScheme.outline,
@@ -265,7 +269,7 @@ class _MediaListPanelState
if (showDelBtn && item.bvid != widget.getBvId()) if (showDelBtn && item.bvid != widget.getBvId())
Positioned( Positioned(
right: 12, right: 12,
bottom: 0, bottom: -6,
child: InkWell( child: InkWell(
customBorder: const CircleBorder(), customBorder: const CircleBorder(),
onTap: () { onTap: () {
@@ -281,7 +285,7 @@ class _MediaListPanelState
child: Icon( child: Icon(
Icons.clear, Icons.clear,
size: 18, size: 18,
color: theme.colorScheme.onSurfaceVariant, color: theme.colorScheme.outline,
), ),
), ),
), ),

View File

@@ -380,6 +380,7 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
color: Colors.white, color: Colors.white,
) )
: Stack( : Stack(
clipBehavior: Clip.none,
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
Icon( Icon(
@@ -731,6 +732,7 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
return Stack( return Stack(
fit: StackFit.passthrough, fit: StackFit.passthrough,
key: _playerKey, key: _playerKey,
clipBehavior: Clip.none,
children: <Widget>[ children: <Widget>[
Obx( Obx(
() => Video( () => Video(