💄 Optimize share as image
This commit is contained in:
		| @@ -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", | ||||
|   "auditLog": "Audit log", | ||||
|   "shareImage": "Share as image", | ||||
|   "shareImageFooter": "See more interesting posts on Solar Network" | ||||
|   "shareImageFooter": "Only on the Solar Network" | ||||
| } | ||||
|   | ||||
| @@ -89,10 +89,25 @@ class _PostActionState extends State<PostAction> { | ||||
|   } | ||||
|  | ||||
|   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 image = await screenshot.captureFromWidget( | ||||
|       PostShareImage(item: widget.item), | ||||
|     final image = await screenshot.captureFromLongWidget( | ||||
|       MediaQuery( | ||||
|         data: MediaQuery.of(context), | ||||
|         child: PostShareImage(item: widget.item), | ||||
|       ), | ||||
|       context: context, | ||||
|       pixelRatio: 2, | ||||
|       constraints: BoxConstraints( | ||||
|         minWidth: 480, | ||||
|         maxWidth: hasAttachment ? 480 : 640, | ||||
|         minHeight: 640, | ||||
|         maxHeight: double.infinity, | ||||
|       ), | ||||
|     ); | ||||
|     final directory = await getApplicationDocumentsDirectory(); | ||||
|     final imageFile = await File( | ||||
|   | ||||
| @@ -31,6 +31,7 @@ class PostItem extends StatefulWidget { | ||||
|   final bool isOverrideEmbedClickable; | ||||
|   final bool isFullDate; | ||||
|   final bool isContentSelectable; | ||||
|   final bool isNonScrollAttachment; | ||||
|   final bool showFeaturedReply; | ||||
|   final String? attachmentParent; | ||||
|  | ||||
| @@ -49,6 +50,7 @@ class PostItem extends StatefulWidget { | ||||
|     this.isOverrideEmbedClickable = false, | ||||
|     this.isFullDate = false, | ||||
|     this.isContentSelectable = false, | ||||
|     this.isNonScrollAttachment = false, | ||||
|     this.showFeaturedReply = false, | ||||
|     this.attachmentParent, | ||||
|     this.padding, | ||||
| @@ -214,6 +216,7 @@ class _PostItemState extends State<PostItem> { | ||||
|           _PostAttachmentWidget( | ||||
|             item: item, | ||||
|             padding: widget.padding, | ||||
|             isNonScrollAttachment: widget.isNonScrollAttachment, | ||||
|           ), | ||||
|           if (widget.showFeaturedReply) | ||||
|             _PostFeaturedReplyWidget(item: item).paddingSymmetric( | ||||
| @@ -380,8 +383,13 @@ class _PostFeaturedReplyWidget extends StatelessWidget { | ||||
| class _PostAttachmentWidget extends StatelessWidget { | ||||
|   final Post item; | ||||
|   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 | ||||
|   Widget build(BuildContext context) { | ||||
| @@ -401,14 +409,6 @@ class _PostAttachmentWidget extends StatelessWidget { | ||||
|         autoload: false, | ||||
|         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 && | ||||
|         attachments.length % 3 == 0 && | ||||
|         !isLargeScreen) { | ||||
| @@ -419,6 +419,14 @@ class _PostAttachmentWidget extends StatelessWidget { | ||||
|         autoload: false, | ||||
|         isGrid: true, | ||||
|       ).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 { | ||||
|       return AttachmentList( | ||||
|         parentId: item.id.toString(), | ||||
|   | ||||
| @@ -15,14 +15,15 @@ class PostShareImage extends StatelessWidget { | ||||
|   Widget build(BuildContext context) { | ||||
|     final textColor = Theme.of(context).colorScheme.onSurface.withOpacity(0.3); | ||||
|     return RootContainer( | ||||
|       child: Column( | ||||
|         mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||
|         crossAxisAlignment: CrossAxisAlignment.center, | ||||
|       child: Wrap( | ||||
|         alignment: WrapAlignment.spaceBetween, | ||||
|         runAlignment: WrapAlignment.center, | ||||
|         children: [ | ||||
|           const Gap(24), | ||||
|           const SizedBox(height: 40), | ||||
|           Material( | ||||
|             color: Colors.transparent, | ||||
|             child: Card( | ||||
|               margin: EdgeInsets.zero, | ||||
|               child: PostItem( | ||||
|                 item: item, | ||||
|                 isShowEmbed: true, | ||||
| @@ -30,11 +31,15 @@ class PostShareImage extends StatelessWidget { | ||||
|                 showFeaturedReply: false, | ||||
|                 isReactable: false, | ||||
|                 isShowReply: false, | ||||
|                 padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 8), | ||||
|                 isNonScrollAttachment: true, | ||||
|                 padding: const EdgeInsets.symmetric( | ||||
|                   horizontal: 4, | ||||
|                   vertical: 8, | ||||
|                 ), | ||||
|                 onComment: () {}, | ||||
|               ), | ||||
|             ), | ||||
|           ), | ||||
|           ).paddingOnly(bottom: 24), | ||||
|           Row( | ||||
|             mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||
|             children: [ | ||||
| @@ -80,6 +85,12 @@ class PostShareImage extends StatelessWidget { | ||||
|                     version: QrVersions.auto, | ||||
|                     padding: const EdgeInsets.all(4), | ||||
|                     size: 48, | ||||
|                     dataModuleStyle: QrDataModuleStyle( | ||||
|                       color: Theme.of(context).colorScheme.onSurface, | ||||
|                     ), | ||||
|                     eyeStyle: QrEyeStyle( | ||||
|                       color: Theme.of(context).colorScheme.onSurface, | ||||
|                     ), | ||||
|                   ), | ||||
|                 ), | ||||
|               ), | ||||
|   | ||||
| @@ -803,6 +803,14 @@ packages: | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     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: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|   | ||||
| @@ -87,6 +87,7 @@ dependencies: | ||||
|   timeline_tile: ^2.0.0 | ||||
|   screenshot: ^3.0.0 | ||||
|   qr_flutter: ^4.1.0 | ||||
|   flutter_resizable_container: ^3.0.0 | ||||
|  | ||||
| dev_dependencies: | ||||
|   flutter_test: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user