💄 Optimize share as image

This commit is contained in:
LittleSheep 2024-10-14 00:03:45 +08:00
parent 65c6083640
commit 0b8a5a3303
6 changed files with 61 additions and 18 deletions

View File

@ -484,5 +484,5 @@
"authMaximumAuthStepsDesc": "The maximum number of authentication steps when logging in, higher value is more secure, lower value is more convenient; default is 2", "authMaximumAuthStepsDesc": "The maximum number of authentication steps when logging in, higher value is more secure, lower value is more convenient; default is 2",
"auditLog": "Audit log", "auditLog": "Audit log",
"shareImage": "Share as image", "shareImage": "Share as image",
"shareImageFooter": "See more interesting posts on Solar Network" "shareImageFooter": "Only on the Solar Network"
} }

View File

@ -89,10 +89,25 @@ class _PostActionState extends State<PostAction> {
} }
Future<void> _shareImage() async { Future<void> _shareImage() async {
final List<String> attachments = widget.item.body['attachments'] is List
? List.from(widget.item.body['attachments']?.whereType<String>())
: List.empty();
final hasAttachment = attachments.isNotEmpty;
final screenshot = ScreenshotController(); final screenshot = ScreenshotController();
final image = await screenshot.captureFromWidget( final image = await screenshot.captureFromLongWidget(
PostShareImage(item: widget.item), MediaQuery(
data: MediaQuery.of(context),
child: PostShareImage(item: widget.item),
),
context: context, context: context,
pixelRatio: 2,
constraints: BoxConstraints(
minWidth: 480,
maxWidth: hasAttachment ? 480 : 640,
minHeight: 640,
maxHeight: double.infinity,
),
); );
final directory = await getApplicationDocumentsDirectory(); final directory = await getApplicationDocumentsDirectory();
final imageFile = await File( final imageFile = await File(

View File

@ -31,6 +31,7 @@ class PostItem extends StatefulWidget {
final bool isOverrideEmbedClickable; final bool isOverrideEmbedClickable;
final bool isFullDate; final bool isFullDate;
final bool isContentSelectable; final bool isContentSelectable;
final bool isNonScrollAttachment;
final bool showFeaturedReply; final bool showFeaturedReply;
final String? attachmentParent; final String? attachmentParent;
@ -49,6 +50,7 @@ class PostItem extends StatefulWidget {
this.isOverrideEmbedClickable = false, this.isOverrideEmbedClickable = false,
this.isFullDate = false, this.isFullDate = false,
this.isContentSelectable = false, this.isContentSelectable = false,
this.isNonScrollAttachment = false,
this.showFeaturedReply = false, this.showFeaturedReply = false,
this.attachmentParent, this.attachmentParent,
this.padding, this.padding,
@ -214,6 +216,7 @@ class _PostItemState extends State<PostItem> {
_PostAttachmentWidget( _PostAttachmentWidget(
item: item, item: item,
padding: widget.padding, padding: widget.padding,
isNonScrollAttachment: widget.isNonScrollAttachment,
), ),
if (widget.showFeaturedReply) if (widget.showFeaturedReply)
_PostFeaturedReplyWidget(item: item).paddingSymmetric( _PostFeaturedReplyWidget(item: item).paddingSymmetric(
@ -380,8 +383,13 @@ class _PostFeaturedReplyWidget extends StatelessWidget {
class _PostAttachmentWidget extends StatelessWidget { class _PostAttachmentWidget extends StatelessWidget {
final Post item; final Post item;
final EdgeInsets? padding; final EdgeInsets? padding;
final bool isNonScrollAttachment;
const _PostAttachmentWidget({required this.item, required this.padding}); const _PostAttachmentWidget({
required this.item,
required this.padding,
required this.isNonScrollAttachment,
});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -401,14 +409,6 @@ class _PostAttachmentWidget extends StatelessWidget {
autoload: false, autoload: false,
isFullWidth: true, isFullWidth: true,
); );
} else if (attachments.length == 1) {
return AttachmentList(
parentId: item.id.toString(),
attachmentIds: item.preload == null ? attachments : null,
attachments: item.preload?.attachments,
autoload: false,
isColumn: true,
).paddingSymmetric(horizontal: (padding?.horizontal ?? 0) + 14);
} else if (attachments.length > 1 && } else if (attachments.length > 1 &&
attachments.length % 3 == 0 && attachments.length % 3 == 0 &&
!isLargeScreen) { !isLargeScreen) {
@ -419,6 +419,14 @@ class _PostAttachmentWidget extends StatelessWidget {
autoload: false, autoload: false,
isGrid: true, isGrid: true,
).paddingSymmetric(horizontal: (padding?.horizontal ?? 0) + 14); ).paddingSymmetric(horizontal: (padding?.horizontal ?? 0) + 14);
} else if (attachments.length == 1 || isNonScrollAttachment) {
return AttachmentList(
parentId: item.id.toString(),
attachmentIds: item.preload == null ? attachments : null,
attachments: item.preload?.attachments,
autoload: false,
isColumn: true,
).paddingSymmetric(horizontal: (padding?.horizontal ?? 0) + 14);
} else { } else {
return AttachmentList( return AttachmentList(
parentId: item.id.toString(), parentId: item.id.toString(),

View File

@ -15,14 +15,15 @@ class PostShareImage extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
final textColor = Theme.of(context).colorScheme.onSurface.withOpacity(0.3); final textColor = Theme.of(context).colorScheme.onSurface.withOpacity(0.3);
return RootContainer( return RootContainer(
child: Column( child: Wrap(
mainAxisAlignment: MainAxisAlignment.spaceBetween, alignment: WrapAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center, runAlignment: WrapAlignment.center,
children: [ children: [
const Gap(24), const SizedBox(height: 40),
Material( Material(
color: Colors.transparent, color: Colors.transparent,
child: Card( child: Card(
margin: EdgeInsets.zero,
child: PostItem( child: PostItem(
item: item, item: item,
isShowEmbed: true, isShowEmbed: true,
@ -30,11 +31,15 @@ class PostShareImage extends StatelessWidget {
showFeaturedReply: false, showFeaturedReply: false,
isReactable: false, isReactable: false,
isShowReply: false, isShowReply: false,
padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 8), isNonScrollAttachment: true,
padding: const EdgeInsets.symmetric(
horizontal: 4,
vertical: 8,
),
onComment: () {}, onComment: () {},
), ),
), ),
), ).paddingOnly(bottom: 24),
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
@ -80,6 +85,12 @@ class PostShareImage extends StatelessWidget {
version: QrVersions.auto, version: QrVersions.auto,
padding: const EdgeInsets.all(4), padding: const EdgeInsets.all(4),
size: 48, size: 48,
dataModuleStyle: QrDataModuleStyle(
color: Theme.of(context).colorScheme.onSurface,
),
eyeStyle: QrEyeStyle(
color: Theme.of(context).colorScheme.onSurface,
),
), ),
), ),
), ),

View File

@ -803,6 +803,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.23" version: "2.0.23"
flutter_resizable_container:
dependency: "direct main"
description:
name: flutter_resizable_container
sha256: "5b15c79c6cc338ed79640c706bb5176baa3333d92fd3627ad279aa3e25d2f0e7"
url: "https://pub.dev"
source: hosted
version: "3.0.0"
flutter_secure_storage: flutter_secure_storage:
dependency: "direct main" dependency: "direct main"
description: description:

View File

@ -87,6 +87,7 @@ dependencies:
timeline_tile: ^2.0.0 timeline_tile: ^2.0.0
screenshot: ^3.0.0 screenshot: ^3.0.0
qr_flutter: ^4.1.0 qr_flutter: ^4.1.0
flutter_resizable_container: ^3.0.0
dev_dependencies: dev_dependencies:
flutter_test: flutter_test: