fix: show store previews fullscreen

This commit is contained in:
zhx 2026-05-18 14:08:16 +08:00
parent a800a0f941
commit b5cb66997b
6 changed files with 43 additions and 80 deletions

View File

@ -56,12 +56,10 @@ class _StoreChatboxPageState
Widget buildItem(StoreListResBean res) {
return SCStoreGridItemCard(
res: res.res,
selected: res.isSelecte,
discount: disCount,
coverHeight: 45.w,
previewWidth: 88.w,
previewHeight: 58.w,
onPreviewTap: () => _togglePreview(res),
onDetailsTap: () => _showDetail(res.res),
);
}
@ -100,15 +98,6 @@ class _StoreChatboxPageState
},
);
}
void _togglePreview(StoreListResBean res) {
final shouldSelect = !res.isSelecte;
for (var value in items) {
value.isSelecte = false;
}
res.isSelecte = shouldSelect;
setState(() {});
}
}
class StoreListResBean {

View File

@ -53,7 +53,6 @@ class StoreDataCardPageState
final res = item;
return SCStoreGridItemCard(
res: res.res,
selected: res.isSelecte,
discount: disCount,
previewKind: SCStoreItemPreviewKind.dataCard,
coverWidth: 72.w,
@ -63,7 +62,6 @@ class StoreDataCardPageState
coverFit: BoxFit.cover,
previewFit: BoxFit.cover,
coverBorderRadius: BorderRadius.circular(6.w),
onPreviewTap: () => _togglePreview(res),
onDetailsTap: () => _showDetail(res.res),
);
}
@ -99,15 +97,6 @@ class StoreDataCardPageState
},
);
}
void _togglePreview(StoreDataCardListResBean res) {
final shouldSelect = !res.isSelecte;
for (final value in items) {
value.isSelecte = false;
}
res.isSelecte = shouldSelect;
setState(() {});
}
}
class StoreDataCardListResBean {

View File

@ -55,10 +55,8 @@ class _StoreHeaddressPageState
Widget buildItem(StoreListResBean res) {
return SCStoreGridItemCard(
res: res.res,
selected: res.isSelecte,
discount: disCount,
previewKind: SCStoreItemPreviewKind.avatarFrame,
onPreviewTap: () => _togglePreview(res),
onDetailsTap: () => _showDetail(res.res),
);
}
@ -97,15 +95,6 @@ class _StoreHeaddressPageState
},
);
}
void _togglePreview(StoreListResBean res) {
final shouldSelect = !res.isSelecte;
for (var value in items) {
value.isSelecte = false;
}
res.isSelecte = shouldSelect;
setState(() {});
}
}
class StoreListResBean {

View File

@ -56,9 +56,7 @@ class _StoreMountainsPageState
Widget buildItem(StoreListResBean res) {
return SCStoreGridItemCard(
res: res.res,
selected: res.isSelecte,
discount: disCount,
onPreviewTap: () => _togglePreview(res),
onDetailsTap: () => _showDetail(res.res),
);
}
@ -97,13 +95,4 @@ class _StoreMountainsPageState
},
);
}
void _togglePreview(StoreListResBean res) {
final shouldSelect = !res.isSelecte;
for (var value in items) {
value.isSelecte = false;
}
res.isSelecte = shouldSelect;
setState(() {});
}
}

View File

@ -57,10 +57,8 @@ class _StoreThemePagePageState
Widget buildItem(StoreListResBean res) {
return SCStoreGridItemCard(
res: res.res,
selected: res.isSelecte,
discount: disCount,
coverBorderRadius: BorderRadius.all(Radius.circular(8.w)),
onPreviewTap: () => _togglePreview(res),
onDetailsTap: () => _showDetail(res.res),
);
}
@ -99,13 +97,4 @@ class _StoreThemePagePageState
}
}
}
void _togglePreview(StoreListResBean res) {
final shouldSelect = !res.isSelecte;
for (var value in items) {
value.isSelecte = false;
}
res.isSelecte = shouldSelect;
setState(() {});
}
}

View File

@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:yumi/app/constants/sc_global_config.dart';
import 'package:yumi/app_localizations.dart';
import 'package:yumi/shared/business_logic/models/res/store_list_res.dart';
@ -16,6 +17,7 @@ const Color _kStoreBagSkeletonShellStrong = Color(0xFF1A4A41);
const Color _kStoreBagSkeletonBoneBase = Color(0xFF2B5C53);
const Color _kStoreBagSkeletonBoneHighlight = Color(0xFF5F8177);
const Color _kStoreBagSkeletonBorder = Color(0x66D8B57B);
const String _kStoreItemPreviewDialogTag = "storeItemFullScreenPreview";
enum SCStoreItemPreviewKind { resource, avatarFrame, dataCard }
@ -107,9 +109,7 @@ class SCStoreGridItemCard extends StatelessWidget {
const SCStoreGridItemCard({
super.key,
required this.res,
required this.selected,
required this.discount,
required this.onPreviewTap,
required this.onDetailsTap,
this.previewKind = SCStoreItemPreviewKind.resource,
this.coverWidth,
@ -122,9 +122,7 @@ class SCStoreGridItemCard extends StatelessWidget {
});
final StoreListRes res;
final bool selected;
final double discount;
final VoidCallback onPreviewTap;
final VoidCallback onDetailsTap;
final SCStoreItemPreviewKind previewKind;
final double? coverWidth;
@ -147,17 +145,12 @@ class SCStoreGridItemCard extends StatelessWidget {
child: Container(
decoration: BoxDecoration(
color:
selected
? const Color(0xff18F2B1).withValues(alpha: 0.1)
: SCGlobalConfig.businessLogicStrategy
.getStoreItemBackgroundColor(),
SCGlobalConfig.businessLogicStrategy
.getStoreItemBackgroundColor(),
border: Border.all(
color:
selected
? SCGlobalConfig.businessLogicStrategy
.getStoreItemSelectedBorderColor()
: SCGlobalConfig.businessLogicStrategy
.getStoreItemUnselectedBorderColor(),
SCGlobalConfig.businessLogicStrategy
.getStoreItemUnselectedBorderColor(),
width: 1.w,
),
borderRadius: BorderRadius.all(Radius.circular(8.w)),
@ -174,7 +167,7 @@ class SCStoreGridItemCard extends StatelessWidget {
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
_buildPreviewTapArea(),
_buildPreviewTapArea(context),
SizedBox(height: 8.w),
_buildPriceRow(amount, firstPrice),
],
@ -186,21 +179,45 @@ class SCStoreGridItemCard extends StatelessWidget {
);
}
Widget _buildPreviewTapArea() {
Widget _buildPreviewTapArea(BuildContext context) {
return GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: onPreviewTap,
onTap: () => _showFullScreenPreview(context),
child: SizedBox(
width: double.infinity,
height:
previewHeight ??
coverHeight ??
(previewKind == SCStoreItemPreviewKind.avatarFrame ? 64.w : 62.w),
child: Center(child: selected ? _buildPreview() : _buildCover()),
child: Center(child: _buildCover()),
),
);
}
void _showFullScreenPreview(BuildContext context) {
SmartDialog.show(
tag: _kStoreItemPreviewDialogTag,
alignment: Alignment.center,
animationType: SmartAnimationType.fade,
maskColor: Colors.transparent,
builder: (_) {
final size = MediaQuery.sizeOf(context);
return GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () => SmartDialog.dismiss(tag: _kStoreItemPreviewDialogTag),
child: Container(
width: size.width,
height: size.height,
color: Colors.black.withValues(alpha: 0.86),
child: Center(
child: IgnorePointer(child: _buildFullScreenPreview(size)),
),
),
);
},
);
}
Widget _buildCover() {
Widget child = netImage(
url: res.propsResources?.cover ?? "",
@ -214,22 +231,23 @@ class SCStoreGridItemCard extends StatelessWidget {
return child;
}
Widget _buildPreview() {
Widget _buildFullScreenPreview(Size screenSize) {
switch (previewKind) {
case SCStoreItemPreviewKind.avatarFrame:
return head(
url: AccountStorage().getCurrentUser()?.userProfile?.userAvatar ?? "",
width: previewWidth ?? 64.w,
height: previewHeight ?? 64.w,
width: screenSize.width * 0.58,
height: screenSize.width * 0.58,
headdress: res.propsResources?.sourceUrl,
headdressCover: res.propsResources?.cover,
);
case SCStoreItemPreviewKind.dataCard:
final width = screenSize.width * 0.84;
return ClipRRect(
borderRadius: BorderRadius.circular(6.w),
borderRadius: BorderRadius.circular(14.w),
child: SizedBox(
width: previewWidth ?? 88.w,
height: previewHeight ?? 58.w,
width: width,
height: width * 0.66,
child: SCDataCardResourceView(
resource: res.propsResources,
fit: previewFit,
@ -238,8 +256,8 @@ class SCStoreGridItemCard extends StatelessWidget {
);
case SCStoreItemPreviewKind.resource:
return SizedBox(
width: previewWidth ?? 72.w,
height: previewHeight ?? 62.w,
width: screenSize.width * 0.86,
height: screenSize.height * 0.42,
child: SCDataCardResourceView(
resource: res.propsResources,
fit: previewFit,