@@ -29,6 +29,7 @@ class LinkPreview extends StatefulWidget {
2929 this .openOnPreviewImageTap = false ,
3030 this .openOnPreviewTitleTap = false ,
3131 this .padding,
32+ this .previewBuilder,
3233 required this .previewData,
3334 this .requestTimeout,
3435 required this .text,
@@ -86,6 +87,9 @@ class LinkPreview extends StatefulWidget {
8687 /// Padding around initial text widget.
8788 final EdgeInsets ? padding;
8889
90+ /// Function that allows you to build a custom link preview.
91+ final Widget Function (BuildContext , PreviewData )? previewBuilder;
92+
8993 /// Pass saved [PreviewData] here so [LinkPreview] would not fetch preview
9094 /// data again.
9195 final PreviewData ? previewData;
@@ -422,20 +426,24 @@ class _LinkPreviewState extends State<LinkPreview>
422426 final previewData = widget.previewData;
423427
424428 if (previewData != null && _hasData (previewData)) {
425- final aspectRatio = widget.previewData! .image == null
426- ? null
427- : widget.previewData! .image! .width /
428- widget.previewData! .image! .height;
429-
430- final width = aspectRatio == 1 ? widget.width : widget.width - 32 ;
431-
432- return _containerWidget (
433- animate: shouldAnimate,
434- child: aspectRatio == 1
435- ? _minimizedBodyWidget (previewData)
436- : _bodyWidget (previewData, width),
437- withPadding: aspectRatio == 1 ,
438- );
429+ if (widget.previewBuilder != null ) {
430+ return widget.previewBuilder !(context, previewData);
431+ } else {
432+ final aspectRatio = widget.previewData! .image == null
433+ ? null
434+ : widget.previewData! .image! .width /
435+ widget.previewData! .image! .height;
436+
437+ final width = aspectRatio == 1 ? widget.width : widget.width - 32 ;
438+
439+ return _containerWidget (
440+ animate: shouldAnimate,
441+ child: aspectRatio == 1
442+ ? _minimizedBodyWidget (previewData)
443+ : _bodyWidget (previewData, width),
444+ withPadding: aspectRatio == 1 ,
445+ );
446+ }
439447 } else {
440448 return _containerWidget (animate: false );
441449 }
0 commit comments