mirror of
https://github.com/bggRGjQaUbCoE/PiliPlus.git
synced 2026-08-05 02:00:13 +08:00
mod: show pendant/decorate
Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
@@ -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'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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),
|
||||||
|
],
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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},
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -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},
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user