diff --git a/packages/flutter_timeline/assets/error_image.png b/packages/flutter_timeline/assets/error_image.png new file mode 100644 index 0000000..4e7e89f Binary files /dev/null and b/packages/flutter_timeline/assets/error_image.png differ diff --git a/packages/flutter_timeline/lib/src/models/timeline_options.dart b/packages/flutter_timeline/lib/src/models/timeline_options.dart index 49988ee..4a6f4c7 100644 --- a/packages/flutter_timeline/lib/src/models/timeline_options.dart +++ b/packages/flutter_timeline/lib/src/models/timeline_options.dart @@ -35,6 +35,7 @@ class TimelineOptions { this.onTapCategory, this.onTapOverview, this.onTapCreatePostInOverview, + this.placeholderImageAssetUrl, }); // Builders @@ -71,6 +72,7 @@ class TimelineOptions { final ImagePickerTheme? imagePickerTheme; final Widget? timelineScreenDrawer; final AppBarBuilder? timelineScreenAppBarBuilder; + final String? placeholderImageAssetUrl; } Widget _defaultFloatingActionButton( diff --git a/packages/flutter_timeline/lib/src/widgets/timeline_post.dart b/packages/flutter_timeline/lib/src/widgets/timeline_post.dart index 66c842a..67569e1 100644 --- a/packages/flutter_timeline/lib/src/widgets/timeline_post.dart +++ b/packages/flutter_timeline/lib/src/widgets/timeline_post.dart @@ -29,6 +29,8 @@ class TimelinePostWidget extends StatefulWidget { } class _TimelinePostWidgetState extends State { + bool imageError = false; + @override Widget build(BuildContext context) { var theme = Theme.of(context); @@ -110,10 +112,29 @@ class _TimelinePostWidgetState extends State { height: 250, decoration: BoxDecoration( borderRadius: BorderRadius.circular(8), - image: DecorationImage( - image: CachedNetworkImageProvider(widget.post.imageUrl!), - fit: BoxFit.cover, - ), + 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, + ), ), ), if (post.image != null) diff --git a/packages/timeline_repository_interface/lib/src/local/local_post_repository.dart b/packages/timeline_repository_interface/lib/src/local/local_post_repository.dart index e61f8be..628d591 100644 --- a/packages/timeline_repository_interface/lib/src/local/local_post_repository.dart +++ b/packages/timeline_repository_interface/lib/src/local/local_post_repository.dart @@ -19,7 +19,7 @@ class LocalPostRepository implements PostRepositoryInterface { userId: "1", firstName: "Jane", lastName: "Doe", - imageUrl: "https://via.placeholder.com/150", + imageUrl: "https://placehold.co/150.png?text=Jane", ); final List _posts = List.generate( @@ -47,7 +47,7 @@ class LocalPostRepository implements PostRepositoryInterface { userId: "2", firstName: "John", lastName: "Doe", - imageUrl: "https://via.placeholder.com/150", + imageUrl: "https://placehold.co/150.png?text=John", ), ), ], @@ -56,9 +56,9 @@ class LocalPostRepository implements PostRepositoryInterface { userId: "1", firstName: "Jane", lastName: "Doe", - imageUrl: "https://via.placeholder.com/150", + imageUrl: "https://placehold.co/150.png?text=Jane", ), - imageUrl: "https://via.placeholder.com/1000", + imageUrl: "https://placehold.co/1000.png?text=$index", ), ); diff --git a/packages/timeline_repository_interface/lib/src/local/local_timeline_user_repository.dart b/packages/timeline_repository_interface/lib/src/local/local_timeline_user_repository.dart index 3b2853c..a1d2400 100644 --- a/packages/timeline_repository_interface/lib/src/local/local_timeline_user_repository.dart +++ b/packages/timeline_repository_interface/lib/src/local/local_timeline_user_repository.dart @@ -8,13 +8,13 @@ class LocalTimelineUserRepository implements TimelineUserRepositoryInterface { userId: "1", firstName: "john", lastName: "doe", - imageUrl: "https://via.placeholder.com/150", + imageUrl: "https://placehold.co/150.png?text=John", ), const TimelineUser( userId: "2", firstName: "jane", lastName: "doe", - imageUrl: "https://via.placeholder.com/150", + imageUrl: "https://placehold.co/150.png?text=Jane", ), ];