diff --git a/example/lib/main.dart b/example/lib/main.dart index d1b6562..a2feed1 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -37,12 +37,12 @@ class _ProfileExampleState extends State { void initState() { super.initState(); _user = User( - 'Firstname', - 'Lastname', - Uint8List.fromList( + firstName: 'Firstname', + lastName: 'Lastname', + image: Uint8List.fromList( [], ), - profileData, + profileData: profileData, ); } @@ -53,10 +53,10 @@ class _ProfileExampleState extends State { bottomActionText: 'Log out', itemBuilderOptions: ItemBuilderOptions( inputDecorationField: { - 'firstName': const InputDecoration( + 'first_name': const InputDecoration( label: Text('First name'), ), - 'lastName': const InputDecoration( + 'last_name': const InputDecoration( label: Text('Last name'), ), 'email': const InputDecoration( @@ -64,13 +64,13 @@ class _ProfileExampleState extends State { ), }, validators: { - 'firstName': (String? value) { + 'first_name': (String? value) { if (value == null || value.isEmpty) { return 'Field empty'; } return null; }, - 'lastName': (String? value) { + 'last_name': (String? value) { if (value == null || value.isEmpty) { return 'Field empty'; } diff --git a/lib/flutter_profile.dart b/lib/flutter_profile.dart index 19a1dac..07c7777 100644 --- a/lib/flutter_profile.dart +++ b/lib/flutter_profile.dart @@ -2,7 +2,7 @@ library flutter_profile; export 'src/widgets/profile/profile_page.dart'; export 'src/widgets/profile/profile_style.dart'; -export 'src/widgets/avatar/avatar.dart'; +export 'src/widgets/avatar/avatar_wrapper.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/models/user.dart b/lib/src/models/user.dart index ef7c943..550bc9e 100644 --- a/lib/src/models/user.dart +++ b/lib/src/models/user.dart @@ -2,39 +2,42 @@ import 'dart:typed_data'; import 'package:flutter/material.dart'; -/// User is used to contain all user data. It consists of three standard fields: firstName, lastName and image. +/// User is used to contain all user data. It consists of three standard fields: firstName, lastName and image/imageUrl. /// /// For additional data profileData can be used. class User { String? firstName; String? lastName; Uint8List? image; + String? imageUrl; ProfileData? profileData; - User( + User({ this.firstName, this.lastName, this.image, + this.imageUrl, this.profileData, - ); + }); - factory User.fromMap(Map data) { - return User( - data['firstName'], - data['lastName'], - data['image'], - data['profileData'], - ); - } + String get displayName => '${firstName ?? ''} ${lastName ?? ''}'; + String get initials => '${firstName?[0] ?? ''}${lastName?[0] ?? ''}'; - Map toMap() { - return { - 'firstName': firstName, - 'lastName': lastName, - 'image': image, - 'profileData': profileData, - }; - } + factory User.fromMap(Map data) => User( + firstName: data['first_name'], + lastName: data['last_name'], + image: data['image'], + imageUrl: data['image_url'], + profileData: data['profile_data'], + ); + + Map toMap() => { + 'first_name': firstName, + 'last_name': lastName, + 'image': image, + 'image_url': image, + 'profile_data': profileData, + }; } /// ProfileData is used to store custom/addintional data for a user. diff --git a/lib/src/widgets/avatar/avatar.dart b/lib/src/widgets/avatar/avatar_wrapper.dart similarity index 50% rename from lib/src/widgets/avatar/avatar.dart rename to lib/src/widgets/avatar/avatar_wrapper.dart index 268fcaa..a2975e7 100644 --- a/lib/src/widgets/avatar/avatar.dart +++ b/lib/src/widgets/avatar/avatar_wrapper.dart @@ -1,79 +1,76 @@ -import 'dart:typed_data'; - 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({ +class AvaterWrapper extends StatelessWidget { + const AvaterWrapper({ Key? key, - this.image, - this.firstName, - this.lastName, + required this.user, this.avatar, this.style = const AvatarStyle(), }) : super(key: key); - final Uint8List? image; - final String? firstName; - final String? lastName; + final User user; final Widget? avatar; final AvatarStyle style; @override - Widget build(BuildContext context) { - return Column( - children: [ - _avatar(), - const SizedBox( - height: 16, - ), - if (firstName != null || lastName != null) - Text( - '${firstName ?? ''} ${lastName ?? ''}', - style: style.displayNameStyle, - ) - ], - ); + Widget build(BuildContext context) => Column( + children: [ + avatar ?? _generateAvatar(), + const SizedBox( + height: 16, + ), + if (user.firstName != null || user.firstName != null) + 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 _avatar() { - if (avatar != null) { - return avatar!; - } - if (image != null && image!.isNotEmpty) { + Widget _generateAvatar() { + var imageProvider = _getImageProvider(); + + if (imageProvider != null) { return Container( width: style.width, height: style.height, decoration: BoxDecoration( shape: BoxShape.circle, image: DecorationImage( - image: MemoryImage(image!), + image: imageProvider, fit: BoxFit.cover, ), ), ); - } else if (firstName != null || lastName != null) { + } else if (user.firstName != null || user.lastName != null) { return Container( width: style.width, height: style.height, decoration: BoxDecoration( - color: _generateColorWithIntials(firstName, lastName), + color: _generateColorWithIntials(user.firstName, user.lastName), shape: BoxShape.circle, ), child: Center( child: Text( style: const TextStyle(fontSize: 40), - _getInitials(firstName, lastName), + user.initials, ), ), ); - } else { - return Container(); } - } - String _getInitials(String? firstName, String? lastName) { - return (firstName?[0] ?? '') + (lastName?[0] ?? ''); + return Container(); } Color _generateColorWithIntials(String? firstName, String? lastName) { diff --git a/lib/src/widgets/profile/proifle_wrapper.dart b/lib/src/widgets/profile/proifle_wrapper.dart index bd6221b..006d0d0 100644 --- a/lib/src/widgets/profile/proifle_wrapper.dart +++ b/lib/src/widgets/profile/proifle_wrapper.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_profile/src/models/user.dart'; import 'package:flutter_profile/src/services/profile_service.dart'; -import 'package:flutter_profile/src/widgets/avatar/avatar.dart'; +import 'package:flutter_profile/src/widgets/avatar/avatar_wrapper.dart'; import 'package:flutter_profile/src/widgets/item_builder/item_builder.dart'; import 'package:flutter_profile/src/widgets/item_builder/item_builder_options.dart'; import 'package:flutter_profile/src/widgets/item_builder/item_list.dart'; @@ -143,12 +143,10 @@ class _ProfileWrapperState extends State { onTap: () async { await widget.service.uploadImage(context); }, - child: Avatar( - firstName: widget.user.firstName, - lastName: widget.user.lastName, + child: AvaterWrapper( + user: widget.user, style: widget.style.avatarStyle, avatar: widget.customAvatar, - image: widget.user.image, ), ), SizedBox( diff --git a/test/profile_test.dart b/test/profile_test.dart index 674b073..012e325 100644 --- a/test/profile_test.dart +++ b/test/profile_test.dart @@ -13,10 +13,10 @@ void main() { home: Material( child: ProfilePage( user: User( - 'Firstname', - 'Lastname', - Uint8List.fromList([]), - TestProfileData(email: 'test@email.com'), + firstName: 'Firstname', + lastName: 'Lastname', + image: Uint8List.fromList([]), + profileData: TestProfileData(email: 'test@email.com'), ), service: TestProfileService(), ), @@ -39,10 +39,7 @@ void main() { home: Material( child: ProfilePage( user: User( - null, - null, - null, - TestProfileData(email: null), + profileData: TestProfileData(email: null), ), service: TestProfileService(), ), @@ -58,10 +55,9 @@ void main() { home: Material( child: ProfilePage( user: User( - 'Firstname', - 'Lastname', - null, - TestProfileData(email: 'test@email.com'), + firstName: 'Firstname', + lastName: 'Lastname', + profileData: TestProfileData(email: 'test@email.com'), ), service: TestProfileService(), ),