mod: show pendant/decorate

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-01-28 10:00:52 +08:00
parent 7f3f7f6bdd
commit b761c35d10
7 changed files with 356 additions and 161 deletions

View File

@@ -129,6 +129,7 @@ class ModuleAuthorModel {
this.type, this.type,
this.vip, this.vip,
this.decorate, this.decorate,
this.pendant,
}); });
String? face; String? face;
@@ -143,7 +144,7 @@ class ModuleAuthorModel {
String? type; String? type;
Map? vip; Map? vip;
Map? decorate; Map? decorate;
// Map? pendant; Map? pendant;
ModuleAuthorModel.fromJson(Map<String, dynamic> json) { ModuleAuthorModel.fromJson(Map<String, dynamic> json) {
face = json['face']; face = json['face'];
@@ -159,7 +160,7 @@ class ModuleAuthorModel {
vip = json['vip']; vip = json['vip'];
if (showDynDecorate) { if (showDynDecorate) {
decorate = json['decorate']; decorate = json['decorate'];
// pendant = json['pendant']; pendant = json['pendant'];
} }
} }

View File

@@ -31,6 +31,13 @@ class AuthorPanel extends StatelessWidget {
this.onRemove, this.onRemove,
}); });
Widget _buildAvatar(double size) => NetworkImgLayer(
width: size,
height: size,
type: 'avatar',
src: item.modules.moduleAuthor.face,
);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Stack( return Stack(
@@ -57,12 +64,14 @@ class AuthorPanel extends StatelessWidget {
}, },
); );
}, },
child: NetworkImgLayer( child: (item.modules.moduleAuthor?.pendant?['image'] as String?)
width: 40, ?.isNotEmpty ==
height: 40, true
type: 'avatar', ? Padding(
src: item.modules.moduleAuthor.face, padding: const EdgeInsets.all(3),
), child: _buildAvatar(34),
)
: _buildAvatar(40),
), ),
const SizedBox(width: 10), const SizedBox(width: 10),
Column( Column(
@@ -137,58 +146,59 @@ class AuthorPanel extends StatelessWidget {
? Row( ? Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
GestureDetector( // GestureDetector(
onTap: // onTap:
item.modules.moduleAuthor.decorate['jump_url'] != null // item.modules.moduleAuthor.decorate['jump_url'] != null
? () { // ? () {
Get.toNamed( // Get.toNamed(
'/webview', // '/webview',
parameters: { // parameters: {
'url': // 'url':
'${item.modules.moduleAuthor.decorate['jump_url']}' // '${item.modules.moduleAuthor.decorate['jump_url']}'
}, // },
); // );
} // }
: null, // : null,
child: Stack( // child:
clipBehavior: Clip.none, Stack(
alignment: Alignment.centerRight, clipBehavior: Clip.none,
children: [ alignment: Alignment.centerRight,
CachedNetworkImage( children: [
height: 32, CachedNetworkImage(
imageUrl: height: 32,
item.modules.moduleAuthor.decorate['card_url'], imageUrl:
), item.modules.moduleAuthor.decorate['card_url'],
if ((item.modules.moduleAuthor.decorate?['fan'] ),
?['num_str'] as String?) if ((item.modules.moduleAuthor.decorate?['fan']
?.isNotEmpty == ?['num_str'] as String?)
true) ?.isNotEmpty ==
Padding( true)
padding: const EdgeInsets.only(right: 32), Padding(
child: Text( padding: const EdgeInsets.only(right: 32),
'${item.modules.moduleAuthor.decorate['fan']['num_str']}', child: Text(
style: TextStyle( '${item.modules.moduleAuthor.decorate['fan']['num_str']}',
fontSize: 11, style: TextStyle(
fontFamily: 'digital_id_num', fontSize: 11,
color: (item.modules.moduleAuthor fontFamily: 'digital_id_num',
.decorate?['fan'] color:
?['color'] as String?) (item.modules.moduleAuthor.decorate?['fan']
?.startsWith('#') == ?['color'] as String?)
true ?.startsWith('#') ==
? Color( true
int.parse( ? Color(
item.modules.moduleAuthor int.parse(
.decorate['fan']['color'] item.modules.moduleAuthor
.replaceFirst('#', '0xFF'), .decorate['fan']['color']
), .replaceFirst('#', '0xFF'),
) ),
: null, )
), : null,
), ),
), ),
], ),
), ],
), ),
// ),
_moreWidget(context), _moreWidget(context),
], ],
) )

View File

@@ -1,5 +1,6 @@
import 'package:PiliPlus/common/widgets/image_save.dart'; import 'package:PiliPlus/common/widgets/image_save.dart';
import 'package:PiliPlus/utils/utils.dart'; import 'package:PiliPlus/utils/utils.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'action_panel.dart'; import 'action_panel.dart';
import 'author_panel.dart'; import 'author_panel.dart';
@@ -79,27 +80,50 @@ class DynamicPanel extends StatelessWidget {
); );
} }
}, },
child: Column( child: (item.modules.moduleAuthor?.pendant?['image'] as String?)
mainAxisAlignment: MainAxisAlignment.start, ?.isNotEmpty ==
children: [ true
Padding( ? Stack(
padding: const EdgeInsets.fromLTRB(12, 12, 12, 6), clipBehavior: Clip.none,
child: AuthorPanel( children: [
item: item, _buildContent(context, item, source, callback),
source: source, Positioned(
onRemove: onRemove, left: 2,
), top: 2,
), child: IgnorePointer(
if (item!.modules!.moduleDynamic!.desc != null || child: CachedNetworkImage(
item!.modules!.moduleDynamic!.major != null) width: 60,
content(context, item, source, callback), height: 60,
forWard(item, context, source, callback), imageUrl: item.modules.moduleAuthor.pendant['image'],
const SizedBox(height: 2), ),
if (source == null) ActionPanel(item: item), ),
], ),
), ],
)
: _buildContent(context, item, source, callback),
), ),
), ),
); );
} }
Widget _buildContent(context, item, source, callback) => Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.fromLTRB(12, 12, 12, 6),
child: AuthorPanel(
item: item,
source: source,
onRemove: onRemove,
),
),
if (item!.modules!.moduleDynamic!.desc != null ||
item!.modules!.moduleDynamic!.major != null)
content(context, item, source, callback),
forWard(item, context, source, callback),
const SizedBox(height: 2),
if (source == null) ActionPanel(item: item),
],
);
} }

View File

@@ -1,4 +1,5 @@
import 'package:PiliPlus/common/widgets/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/network_img_layer.dart';
import 'package:PiliPlus/models/dynamics/result.dart';
import 'package:PiliPlus/models/space/card.dart' as space; import 'package:PiliPlus/models/space/card.dart' as space;
import 'package:PiliPlus/models/space/images.dart' as space; import 'package:PiliPlus/models/space/images.dart' as space;
import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/extension.dart';
@@ -444,22 +445,22 @@ class UserInfoCard extends StatelessWidget {
), ),
); );
_buildAvatar(BuildContext context) => Hero( _buildAvatar(BuildContext context) => Container(
tag: card.face ?? 'avatarTag', decoration: BoxDecoration(
child: GestureDetector( border: Border.all(
onTap: () { width: 2.5,
context.imageView( color: Theme.of(context).colorScheme.surface,
imgList: [card.face ?? 'avatarTag'], ),
); shape: BoxShape.circle,
}, ),
child: Container( child: Hero(
decoration: BoxDecoration( tag: card.face ?? 'avatarTag',
border: Border.all( child: GestureDetector(
width: 2.5, onTap: () {
color: Theme.of(context).colorScheme.surface, context.imageView(
), imgList: [card.face ?? 'avatarTag'],
shape: BoxShape.circle, );
), },
child: NetworkImgLayer( child: NetworkImgLayer(
src: card.face, src: card.face,
type: 'avatar', type: 'avatar',
@@ -489,6 +490,19 @@ class UserInfoCard extends StatelessWidget {
left: 20, left: 20,
child: _buildAvatar(context), child: _buildAvatar(context),
), ),
if (ModuleAuthorModel.showDynDecorate &&
card.pendant?.image?.isNotEmpty == true)
Positioned(
top: 82.5,
left: -7.5,
child: IgnorePointer(
child: CachedNetworkImage(
width: 140,
height: 140,
imageUrl: card.pendant!.image!,
),
),
),
if (card.officialVerify?.icon?.isNotEmpty == true || if (card.officialVerify?.icon?.isNotEmpty == true ||
(card.vip?.vipStatus ?? -1) > 0) (card.vip?.vipStatus ?? -1) > 0)
Positioned( Positioned(
@@ -572,6 +586,19 @@ class UserInfoCard extends StatelessWidget {
clipBehavior: Clip.none, clipBehavior: Clip.none,
children: [ children: [
_buildAvatar(context), _buildAvatar(context),
if (ModuleAuthorModel.showDynDecorate &&
card.pendant?.image?.isNotEmpty == true)
Positioned(
top: -27.5,
left: -27.5,
child: IgnorePointer(
child: CachedNetworkImage(
width: 140,
height: 140,
imageUrl: card.pendant!.image!,
),
),
),
if (card.officialVerify?.icon?.isNotEmpty == true || if (card.officialVerify?.icon?.isNotEmpty == true ||
(card.vip?.vipStatus ?? -1) > 0) (card.vip?.vipStatus ?? -1) > 0)
Positioned( Positioned(

View File

@@ -1908,7 +1908,7 @@ List<SettingsModel> get extraSettings => [
), ),
SettingsModel( SettingsModel(
settingsType: SettingsType.sw1tch, settingsType: SettingsType.sw1tch,
title: '展示动态装饰', title: '展示头像/评论/动态装饰',
leading: Icon(MdiIcons.stickerCircleOutline), leading: Icon(MdiIcons.stickerCircleOutline),
setKey: SettingBoxKey.showDynDecorate, setKey: SettingBoxKey.showDynDecorate,
defaultVal: true, defaultVal: true,

View File

@@ -2,8 +2,10 @@ import 'dart:math';
import 'package:PiliPlus/common/widgets/imageview.dart'; import 'package:PiliPlus/common/widgets/imageview.dart';
import 'package:PiliPlus/http/video.dart'; import 'package:PiliPlus/http/video.dart';
import 'package:PiliPlus/models/dynamics/result.dart';
import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/global_data.dart'; import 'package:PiliPlus/utils/global_data.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
@@ -77,10 +79,56 @@ class ReplyItem extends StatelessWidget {
}, },
child: Column( child: Column(
children: [ children: [
Padding( if (ModuleAuthorModel.showDynDecorate &&
padding: const EdgeInsets.fromLTRB(12, 14, 8, 5), (replyItem?.member?.userSailing?.cardbg?['image'] as String?)
child: content(context), ?.isNotEmpty ==
), true)
Stack(
clipBehavior: Clip.none,
children: [
Positioned(
top: 8,
right: 12,
child: Stack(
alignment: Alignment.centerRight,
children: [
CachedNetworkImage(
height: 38,
imageUrl:
replyItem?.member?.userSailing?.cardbg?['image'],
),
if ((replyItem?.member?.userSailing?.cardbg?['fan']
?['num_desc'] as String?)
?.isNotEmpty ==
true)
Text(
'NO.\n${replyItem?.member?.userSailing?.cardbg?['fan']?['num_desc']}',
style:
(replyItem?.member?.userSailing?.cardbg?['fan']
?['color'] as String?)
?.startsWith('#') ==
true
? TextStyle(
fontSize: 8,
fontFamily: 'digital_id_num',
color: Color(
int.parse(
replyItem?.member?.userSailing
?.cardbg?['fan']?['color']
.replaceFirst('#', '0xFF'),
),
),
)
: null,
),
],
),
),
_buildAuthorPanel(context),
],
)
else
_buildAuthorPanel(context),
if (needDivider) if (needDivider)
Divider( Divider(
indent: 55, indent: 55,
@@ -97,18 +145,44 @@ class ReplyItem extends StatelessWidget {
); );
} }
Widget lfAvtar(BuildContext context, String heroTag) { Widget _buildAuthorPanel(context) => Padding(
padding: const EdgeInsets.fromLTRB(12, 14, 8, 5),
child: content(context),
);
Widget lfAvtar(BuildContext context) {
return Stack( return Stack(
clipBehavior: Clip.none,
children: [ children: [
Hero( if (ModuleAuthorModel.showDynDecorate &&
tag: heroTag, replyItem?.member?.pendant?.image?.isNotEmpty == true) ...[
child: NetworkImgLayer( Padding(
padding: const EdgeInsets.all(2),
child: NetworkImgLayer(
src: replyItem!.member!.avatar,
width: 30,
height: 30,
type: 'avatar',
),
),
Positioned(
left: -9,
top: -9,
child: IgnorePointer(
child: CachedNetworkImage(
width: 52,
height: 52,
imageUrl: replyItem!.member!.pendant!.image!,
),
),
),
] else
NetworkImgLayer(
src: replyItem!.member!.avatar, src: replyItem!.member!.avatar,
width: 34, width: 34,
height: 34, height: 34,
type: 'avatar', type: 'avatar',
), ),
),
if (replyItem!.member!.vip!['vipStatus'] > 0) if (replyItem!.member!.vip!['vipStatus'] > 0)
Positioned( Positioned(
right: 0, right: 0,
@@ -171,27 +245,25 @@ class ReplyItem extends StatelessWidget {
Widget content(BuildContext context) { Widget content(BuildContext context) {
if (replyItem?.member == null) return const SizedBox(); if (replyItem?.member == null) return const SizedBox();
final String heroTag = Utils.makeHeroTag(replyItem!.mid);
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: <Widget>[ children: <Widget>[
/// fix Stack内GestureDetector onTap无效 /// fix Stack内GestureDetector onTap无效
GestureDetector( GestureDetector(
behavior: HitTestBehavior.opaque, behavior: HitTestBehavior.opaque,
onTap: () { onTap: () {
feedBack(); feedBack();
Get.toNamed('/member?mid=${replyItem!.mid}', arguments: { Get.toNamed('/member?mid=${replyItem!.mid}');
'face': replyItem!.member!.avatar!,
'heroTag': heroTag
});
}, },
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: <Widget>[ children: <Widget>[
lfAvtar(context, heroTag), lfAvtar(context),
const SizedBox(width: 12), const SizedBox(width: 12),
Column( Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Row( Row(
@@ -223,6 +295,7 @@ class ReplyItem extends StatelessWidget {
], ],
), ),
Row( Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[ children: <Widget>[
Text( Text(
Utils.dateFormat(replyItem!.ctime), Utils.dateFormat(replyItem!.ctime),
@@ -470,14 +543,8 @@ class ReplyItem extends StatelessWidget {
recognizer: TapGestureRecognizer() recognizer: TapGestureRecognizer()
..onTap = () { ..onTap = () {
feedBack(); feedBack();
final String heroTag = Utils.makeHeroTag(
replies![i].member!.mid);
Get.toNamed( Get.toNamed(
'/member?mid=${replies![i].member!.mid}', '/member?mid=${replies![i].member!.mid}');
arguments: {
'face': replies![i].member!.avatar,
'heroTag': heroTag
});
}, },
), ),
if (replies![i].isUp!) ...[ if (replies![i].isUp!) ...[
@@ -682,11 +749,7 @@ class ReplyItem extends StatelessWidget {
), ),
recognizer: TapGestureRecognizer() recognizer: TapGestureRecognizer()
..onTap = () { ..onTap = () {
final String heroTag = Utils.makeHeroTag(userId); Get.toNamed('/member?mid=$userId');
Get.toNamed(
'/member?mid=$userId',
arguments: {'face': '', 'heroTag': heroTag},
);
}, },
), ),
); );

View File

@@ -4,9 +4,11 @@ import 'package:PiliPlus/common/widgets/badge.dart';
import 'package:PiliPlus/common/widgets/imageview.dart'; import 'package:PiliPlus/common/widgets/imageview.dart';
import 'package:PiliPlus/grpc/app/main/community/reply/v1/reply.pb.dart'; import 'package:PiliPlus/grpc/app/main/community/reply/v1/reply.pb.dart';
import 'package:PiliPlus/http/video.dart'; import 'package:PiliPlus/http/video.dart';
import 'package:PiliPlus/models/dynamics/result.dart';
import 'package:PiliPlus/pages/video/detail/reply/widgets/zan_grpc.dart'; import 'package:PiliPlus/pages/video/detail/reply/widgets/zan_grpc.dart';
import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/global_data.dart'; import 'package:PiliPlus/utils/global_data.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
@@ -89,40 +91,116 @@ class ReplyItemGrpc extends StatelessWidget {
}, },
); );
}, },
child: Column( child: _buildContent(context),
children: [
Padding(
padding: const EdgeInsets.fromLTRB(12, 14, 8, 5),
child: content(context),
),
if (needDivider)
Divider(
indent: 55,
endIndent: 15,
height: 0.3,
color: Theme.of(context)
.colorScheme
.onInverseSurface
.withOpacity(0.5),
)
],
),
), ),
); );
} }
Widget lfAvtar(BuildContext context, String heroTag) { Widget _buildAuthorPanel(context) => Padding(
return Stack( padding: const EdgeInsets.fromLTRB(12, 14, 8, 5),
child: content(context),
);
Widget _buildContent(context) {
print(replyItem.member.garbCardImage);
return Column(
children: [ children: [
Hero( if (ModuleAuthorModel.showDynDecorate &&
tag: heroTag, replyItem.member.hasGarbCardImage())
child: NetworkImgLayer( Stack(
clipBehavior: Clip.none,
children: [
Positioned(
top: 8,
right: 12,
// child: GestureDetector(
// onTap: replyItem.member.garbCardJumpUrl.isNotEmpty
// ? () {
// Get.toNamed(
// 'webview',
// parameters: {
// 'url': replyItem.member.garbCardJumpUrl
// },
// );
// }
// : null,
child: Stack(
alignment: Alignment.centerRight,
children: [
CachedNetworkImage(
height: 38,
imageUrl: replyItem.member.garbCardImage,
),
if (replyItem.member.hasGarbCardNumber())
Text(
'NO.\n${replyItem.member.garbCardNumber}',
style: replyItem.member.garbCardFanColor.startsWith('#')
? TextStyle(
fontSize: 8,
fontFamily: 'digital_id_num',
color: Color(
int.parse(
replyItem.member.garbCardFanColor
.replaceFirst('#', '0xFF'),
),
),
)
: null,
),
],
),
),
// ),
_buildAuthorPanel(context),
],
)
else
_buildAuthorPanel(context),
if (needDivider)
Divider(
indent: 55,
endIndent: 15,
height: 0.3,
color:
Theme.of(context).colorScheme.onInverseSurface.withOpacity(0.5),
)
],
);
}
Widget lfAvtar(BuildContext context) {
return Stack(
clipBehavior: Clip.none,
children: [
if (ModuleAuthorModel.showDynDecorate &&
replyItem.member.hasGarbPendantImage()) ...[
Padding(
padding: const EdgeInsets.all(2),
child: NetworkImgLayer(
src: replyItem.member.face,
width: 30,
height: 30,
type: 'avatar',
),
),
Positioned(
left: -9,
top: -9,
child: IgnorePointer(
child: CachedNetworkImage(
width: 52,
height: 52,
imageUrl: replyItem.member.garbPendantImage,
),
),
),
] else
NetworkImgLayer(
src: replyItem.member.face, src: replyItem.member.face,
width: 34, width: 34,
height: 34, height: 34,
type: 'avatar', type: 'avatar',
), ),
),
if (replyItem.member.vipStatus > 0) if (replyItem.member.vipStatus > 0)
Positioned( Positioned(
right: 0, right: 0,
@@ -182,28 +260,29 @@ class ReplyItemGrpc extends StatelessWidget {
} }
Widget content(BuildContext context) { Widget content(BuildContext context) {
final String heroTag = Utils.makeHeroTag(replyItem.mid);
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: <Widget>[ children: <Widget>[
/// fix Stack内GestureDetector onTap无效 /// fix Stack内GestureDetector onTap无效
GestureDetector( GestureDetector(
behavior: HitTestBehavior.opaque, behavior: HitTestBehavior.opaque,
onTap: () { onTap: () {
feedBack(); feedBack();
Get.toNamed('/member?mid=${replyItem.mid}', Get.toNamed('/member?mid=${replyItem.mid}');
arguments: {'face': replyItem.member.face, 'heroTag': heroTag});
}, },
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: <Widget>[ children: <Widget>[
lfAvtar(context, heroTag), lfAvtar(context),
const SizedBox(width: 12), const SizedBox(width: 12),
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [ children: [
Row( Row(
mainAxisSize: MainAxisSize.min,
children: [ children: [
Text( Text(
replyItem.member.name, replyItem.member.name,
@@ -232,6 +311,7 @@ class ReplyItemGrpc extends StatelessWidget {
], ],
), ),
Row( Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[ children: <Widget>[
Text( Text(
Utils.dateFormat(replyItem.ctime.toInt()), Utils.dateFormat(replyItem.ctime.toInt()),
@@ -496,15 +576,9 @@ class ReplyItemGrpc extends StatelessWidget {
recognizer: TapGestureRecognizer() recognizer: TapGestureRecognizer()
..onTap = () { ..onTap = () {
feedBack(); feedBack();
final String heroTag = Utils.makeHeroTag(
replyItem.replies[i].member.mid);
Get.toNamed( Get.toNamed(
'/member?mid=${replyItem.replies[i].member.mid}', '/member?mid=${replyItem.replies[i].member.mid}',
arguments: { );
'face':
replyItem.replies[i].member.face,
'heroTag': heroTag
});
}, },
), ),
if (replyItem.replies[i].mid == upMid) ...[ if (replyItem.replies[i].mid == upMid) ...[
@@ -715,11 +789,7 @@ class ReplyItemGrpc extends StatelessWidget {
), ),
recognizer: TapGestureRecognizer() recognizer: TapGestureRecognizer()
..onTap = () { ..onTap = () {
final String heroTag = Utils.makeHeroTag(userId); Get.toNamed('/member?mid=$userId');
Get.toNamed(
'/member?mid=$userId',
arguments: {'face': '', 'heroTag': heroTag},
);
}, },
), ),
); );