diff --git a/packages/flutter_timeline/lib/src/models/timeline_options.dart b/packages/flutter_timeline/lib/src/models/timeline_options.dart index 8f518f8..db97551 100644 --- a/packages/flutter_timeline/lib/src/models/timeline_options.dart +++ b/packages/flutter_timeline/lib/src/models/timeline_options.dart @@ -36,6 +36,7 @@ class TimelineOptions { this.onTapOverview, this.onTapCreatePostInOverview, this.placeholderImageAssetUrl, + this.tapImageToOpenPost = true, }); // Builders @@ -73,6 +74,7 @@ class TimelineOptions { final Widget? timelineScreenDrawer; final AppBarBuilder? timelineScreenAppBarBuilder; final String? placeholderImageAssetUrl; + final bool tapImageToOpenPost; } Widget _defaultFloatingActionButton( diff --git a/packages/flutter_timeline/lib/src/widgets/tappable_image.dart b/packages/flutter_timeline/lib/src/widgets/tappable_image.dart index 7a0fb6c..aef9716 100644 --- a/packages/flutter_timeline/lib/src/widgets/tappable_image.dart +++ b/packages/flutter_timeline/lib/src/widgets/tappable_image.dart @@ -10,6 +10,7 @@ class TappableImage extends StatefulWidget { required this.onLike, required this.userId, required this.likeAndDislikeIcon, + this.onTap, super.key, }); @@ -17,6 +18,7 @@ class TappableImage extends StatefulWidget { final String userId; final Future Function() onLike; final (Icon?, Icon?) likeAndDislikeIcon; + final VoidCallback? onTap; @override State createState() => _TappableImageState(); @@ -66,6 +68,7 @@ class _TappableImageState extends State @override Widget build(BuildContext context) => InkWell( + onTap: widget.onTap != null ? () => widget.onTap!() : null, onDoubleTap: () async { if (loading) { return; diff --git a/packages/flutter_timeline/lib/src/widgets/timeline_post.dart b/packages/flutter_timeline/lib/src/widgets/timeline_post.dart index 67569e1..b359ed5 100644 --- a/packages/flutter_timeline/lib/src/widgets/timeline_post.dart +++ b/packages/flutter_timeline/lib/src/widgets/timeline_post.dart @@ -81,6 +81,9 @@ class _TimelinePostWidgetState extends State { if (options.doubleTapToLike) ...[ TappableImage( post: post, + onTap: widget.options.tapImageToOpenPost + ? () => widget.onTapPost(widget.post) + : null, onLike: () async { if (isLikedByCurrentUser) { widget.options.onTapUnlike ?? @@ -108,33 +111,38 @@ class _TimelinePostWidgetState extends State { ), ] else ...[ if (post.imageUrl != null) - Container( - height: 250, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - image: imageError - ? DecorationImage( - image: options.placeholderImageAssetUrl != null - ? AssetImage( - options.placeholderImageAssetUrl!, - ) - : const AssetImage( - "assets/error_image.png", - package: "flutter_timeline", - ), - fit: BoxFit.cover, - ) - : DecorationImage( - onError: (exception, stackTrace) { - setState(() { - imageError = true; - }); - }, - image: CachedNetworkImageProvider( - widget.post.imageUrl!, + GestureDetector( + onTap: widget.options.tapImageToOpenPost + ? () => widget.onTapPost(widget.post) + : null, + child: Container( + height: 250, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + image: imageError + ? DecorationImage( + image: options.placeholderImageAssetUrl != null + ? AssetImage( + options.placeholderImageAssetUrl!, + ) + : const AssetImage( + "assets/error_image.png", + package: "flutter_timeline", + ), + fit: BoxFit.cover, + ) + : DecorationImage( + onError: (exception, stackTrace) { + setState(() { + imageError = true; + }); + }, + image: CachedNetworkImageProvider( + widget.post.imageUrl!, + ), + fit: BoxFit.cover, ), - fit: BoxFit.cover, - ), + ), ), ), if (post.image != null)