From b30d5305ba0a3f10fd7c272969611ab465f4dc3d Mon Sep 17 00:00:00 2001 From: Stein Milder Date: Fri, 21 Oct 2022 10:53:38 +0200 Subject: [PATCH] fix unit test: Profile page with preset values --- CHANGELOG.md | 4 + lib/flutter_profile.dart | 1 + lib/src/widgets/avatar/avatar.dart | 66 +++++++++++++++ lib/src/widgets/avatar/avatar_style.dart | 4 + lib/src/widgets/avatar/avatar_wrapper.dart | 84 ++++++-------------- lib/src/widgets/profile/proifle_wrapper.dart | 16 ++-- test/profile_test.dart | 3 - test/test_classes/test_profile_data.dart | 29 +++---- 8 files changed, 117 insertions(+), 90 deletions(-) create mode 100644 lib/src/widgets/avatar/avatar.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c75b98..f8589a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,3 +5,7 @@ ## 0.0.2 * Add prioritizedItems option to display items at the top of the page. + +## 0.0.3 + +* Add support for image URL (instead of in-memory image using image parameter from User model) \ No newline at end of file diff --git a/lib/flutter_profile.dart b/lib/flutter_profile.dart index 07c7777..66018b3 100644 --- a/lib/flutter_profile.dart +++ b/lib/flutter_profile.dart @@ -3,6 +3,7 @@ library flutter_profile; export 'src/widgets/profile/profile_page.dart'; export 'src/widgets/profile/profile_style.dart'; export 'src/widgets/avatar/avatar_wrapper.dart'; +export 'src/widgets/avatar/avatar.dart'; export 'src/widgets/avatar/avatar_style.dart'; export 'src/services/profile_service.dart'; export 'src/widgets/item_builder/item_builder.dart'; diff --git a/lib/src/widgets/avatar/avatar.dart b/lib/src/widgets/avatar/avatar.dart new file mode 100644 index 0000000..f4ae9b9 --- /dev/null +++ b/lib/src/widgets/avatar/avatar.dart @@ -0,0 +1,66 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_profile/src/models/user.dart'; +import 'package:flutter_profile/src/widgets/avatar/avatar_style.dart'; + +class Avatar extends StatelessWidget { + const Avatar({ + Key? key, + required this.user, + this.style = const AvatarStyle(), + }) : super(key: key); + + final User user; + final AvatarStyle style; + + @override + Widget build(BuildContext context) { + var imageProvider = _getImageProvider(); + + if (imageProvider != null) { + return Container( + width: style.width, + height: style.height, + decoration: BoxDecoration( + shape: BoxShape.circle, + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, + ), + ), + ); + } else if (user.firstName != null || user.lastName != null) { + return Container( + width: style.width, + height: style.height, + decoration: BoxDecoration( + color: _generateColorWithIntials(user.firstName, user.lastName), + shape: BoxShape.circle, + ), + child: Center( + child: Text( + style: const TextStyle(fontSize: 40), + user.initials, + ), + ), + ); + } + + return Container(); + } + + ImageProvider? _getImageProvider() { + if (user.image != null) { + return MemoryImage(user.image!); + } else if (user.imageUrl != null) { + return NetworkImage(user.imageUrl!); + } + return null; + } + + Color _generateColorWithIntials(String? firstName, String? lastName) { + var uniqueInitialId = (firstName?.toLowerCase().codeUnitAt(0) ?? 0) + + (lastName?.toLowerCase().codeUnitAt(0) ?? 0); + + return Colors.primaries[uniqueInitialId % Colors.primaries.length]; + } +} diff --git a/lib/src/widgets/avatar/avatar_style.dart b/lib/src/widgets/avatar/avatar_style.dart index 3107a90..df77df0 100644 --- a/lib/src/widgets/avatar/avatar_style.dart +++ b/lib/src/widgets/avatar/avatar_style.dart @@ -13,12 +13,16 @@ class AvatarStyle { const AvatarStyle({ this.width = 100, this.height = 100, + this.displayName = true, this.initialStyle = const TextStyle(), + this.displayNamePadding = const EdgeInsets.only(top: 16), this.displayNameStyle = const TextStyle(), }); final double width; final double height; final TextStyle initialStyle; + final bool displayName; + final EdgeInsets displayNamePadding; final TextStyle displayNameStyle; } diff --git a/lib/src/widgets/avatar/avatar_wrapper.dart b/lib/src/widgets/avatar/avatar_wrapper.dart index a2975e7..aa17b8a 100644 --- a/lib/src/widgets/avatar/avatar_wrapper.dart +++ b/lib/src/widgets/avatar/avatar_wrapper.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_profile/src/models/user.dart'; +import 'package:flutter_profile/src/widgets/avatar/avatar.dart'; import 'package:flutter_profile/src/widgets/avatar/avatar_style.dart'; class AvaterWrapper extends StatelessWidget { @@ -15,68 +16,29 @@ class AvaterWrapper extends StatelessWidget { final AvatarStyle style; @override - Widget build(BuildContext context) => Column( - children: [ - avatar ?? _generateAvatar(), - const SizedBox( - height: 16, - ), - if (user.firstName != null || user.firstName != null) - Text( + Widget build(BuildContext context) { + var avatar = this.avatar ?? + Avatar( + user: user, + style: style, + ); + + if (!style.displayName) { + return avatar; + } + + return Column( + children: [ + avatar, + if (user.firstName != null || user.firstName != null) + Padding( + padding: style.displayNamePadding, + child: Text( user.displayName, style: style.displayNameStyle, - ) - ], - ); - - ImageProvider? _getImageProvider() { - if (user.image != null) { - return MemoryImage(user.image!); - } else if (user.imageUrl != null) { - return NetworkImage(user.imageUrl!); - } - return null; - } - - Widget _generateAvatar() { - var imageProvider = _getImageProvider(); - - if (imageProvider != null) { - return Container( - width: style.width, - height: style.height, - decoration: BoxDecoration( - shape: BoxShape.circle, - image: DecorationImage( - image: imageProvider, - fit: BoxFit.cover, - ), - ), - ); - } else if (user.firstName != null || user.lastName != null) { - return Container( - width: style.width, - height: style.height, - decoration: BoxDecoration( - color: _generateColorWithIntials(user.firstName, user.lastName), - shape: BoxShape.circle, - ), - child: Center( - child: Text( - style: const TextStyle(fontSize: 40), - user.initials, - ), - ), - ); - } - - return Container(); - } - - Color _generateColorWithIntials(String? firstName, String? lastName) { - var uniqueInitialId = (firstName?.toLowerCase().codeUnitAt(0) ?? 0) + - (lastName?.toLowerCase().codeUnitAt(0) ?? 0); - - return Colors.primaries[uniqueInitialId % Colors.primaries.length]; + ), + ) + ], + ); } } diff --git a/lib/src/widgets/profile/proifle_wrapper.dart b/lib/src/widgets/profile/proifle_wrapper.dart index 006d0d0..da722a4 100644 --- a/lib/src/widgets/profile/proifle_wrapper.dart +++ b/lib/src/widgets/profile/proifle_wrapper.dart @@ -56,14 +56,14 @@ class _ProfileWrapperState extends State { ); defaultItems.add( builder.build( - 'firstName', + 'first_name', firstNameKey, widget.user.firstName, null, (v) { widget.user.firstName = v; - widget.service.editProfile(widget.user, 'firstName', v); + widget.service.editProfile(widget.user, 'first_name', v); }, ), ); @@ -74,14 +74,14 @@ class _ProfileWrapperState extends State { ); defaultItems.add( builder.build( - 'lastName', + 'last_name', lastNameKey, widget.user.lastName, null, (v) { widget.user.lastName = v; - widget.service.editProfile(widget.user, 'lastName', v); + widget.service.editProfile(widget.user, 'last_name', v); }, ), ); @@ -93,14 +93,14 @@ class _ProfileWrapperState extends State { } else { defaultItems.add( widget.itemBuilder!.build( - 'firstName', + 'first_name', firstNameKey, widget.user.firstName, null, (v) { widget.user.firstName = v; - widget.service.editProfile(widget.user, 'firstname', v); + widget.service.editProfile(widget.user, 'first_name', v); }, ), ); @@ -111,14 +111,14 @@ class _ProfileWrapperState extends State { ); defaultItems.add( widget.itemBuilder!.build( - 'lastName', + 'last_name', lastNameKey, widget.user.lastName, null, (v) { widget.user.lastName = v; - widget.service.editProfile(widget.user, 'lastName', v); + widget.service.editProfile(widget.user, 'last_name', v); }, ), ); diff --git a/test/profile_test.dart b/test/profile_test.dart index 012e325..3cd6f9c 100644 --- a/test/profile_test.dart +++ b/test/profile_test.dart @@ -1,8 +1,6 @@ -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_profile/flutter_profile.dart'; import 'package:flutter_test/flutter_test.dart'; - import 'test_classes/test_profile_data.dart'; import 'test_classes/test_profile_service.dart'; @@ -15,7 +13,6 @@ void main() { user: User( firstName: 'Firstname', lastName: 'Lastname', - image: Uint8List.fromList([]), profileData: TestProfileData(email: 'test@email.com'), ), service: TestProfileService(), diff --git a/test/test_classes/test_profile_data.dart b/test/test_classes/test_profile_data.dart index 1207ab6..3c7d93b 100644 --- a/test/test_classes/test_profile_data.dart +++ b/test/test_classes/test_profile_data.dart @@ -12,28 +12,21 @@ class TestProfileData extends ProfileData { Map mapWidget( VoidCallback update, BuildContext context, - ) { - return { - 'email': null, - }; - } + ) => + { + 'email': null, + }; @override - ProfileData fromMap(Map data) { - return TestProfileData( - email: data['email'], - ); - } + ProfileData fromMap(Map data) => TestProfileData( + email: data['email'], + ); @override - Map toMap() { - return { - 'email': email, - }; - } + Map toMap() => { + 'email': email, + }; @override - ProfileData create() { - return TestProfileData(); - } + ProfileData create() => TestProfileData(); }