From de9328d491e90aea9c0db5242be2ec220c7442a1 Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Mon, 19 Jun 2023 15:24:21 +0530 Subject: [PATCH 1/2] feat(ui): add support for builder to override avatars in StreamChannelAvatar. Signed-off-by: xsahil03x --- .../lib/src/avatars/group_avatar.dart | 8 ++ .../lib/src/avatars/user_avatar.dart | 8 ++ .../src/channel/stream_channel_avatar.dart | 73 ++++++++++++++----- 3 files changed, 71 insertions(+), 18 deletions(-) diff --git a/packages/stream_chat_flutter/lib/src/avatars/group_avatar.dart b/packages/stream_chat_flutter/lib/src/avatars/group_avatar.dart index 0571c7fd..be70bdbf 100644 --- a/packages/stream_chat_flutter/lib/src/avatars/group_avatar.dart +++ b/packages/stream_chat_flutter/lib/src/avatars/group_avatar.dart @@ -1,6 +1,14 @@ import 'package:flutter/material.dart'; import 'package:stream_chat_flutter/stream_chat_flutter.dart'; +/// WidgetBuilder for [StreamGroupAvatar]. +typedef StreamGroupAvatarBuilder = Widget Function( + BuildContext context, + List members, + // ignore: avoid_positional_boolean_parameters + bool isSelected, +); + /// {@template streamGroupAvatar} /// Widget for constructing a group of images /// {@endtemplate} diff --git a/packages/stream_chat_flutter/lib/src/avatars/user_avatar.dart b/packages/stream_chat_flutter/lib/src/avatars/user_avatar.dart index 2290fca9..72ec020b 100644 --- a/packages/stream_chat_flutter/lib/src/avatars/user_avatar.dart +++ b/packages/stream_chat_flutter/lib/src/avatars/user_avatar.dart @@ -2,6 +2,14 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:stream_chat_flutter/stream_chat_flutter.dart'; +/// WidgetBuilder for [StreamUserAvatar]. +typedef StreamUserAvatarBuilder = Widget Function( + BuildContext context, + User user, + // ignore: avoid_positional_boolean_parameters + bool isSelected, +); + /// {@template streamUserAvatar} /// Displays a user's avatar. /// {@endtemplate} diff --git a/packages/stream_chat_flutter/lib/src/channel/stream_channel_avatar.dart b/packages/stream_chat_flutter/lib/src/channel/stream_channel_avatar.dart index 5ad7a000..9090c33a 100644 --- a/packages/stream_chat_flutter/lib/src/channel/stream_channel_avatar.dart +++ b/packages/stream_chat_flutter/lib/src/channel/stream_channel_avatar.dart @@ -54,6 +54,9 @@ class StreamChannelAvatar extends StatelessWidget { this.selected = false, this.selectionColor, this.selectionThickness = 4, + this.ownSpaceAvatarBuilder, + this.oneToOneAvatarBuilder, + this.groupAvatarBuilder, }) : assert( channel.state != null, 'Channel ${channel.id} is not initialized', @@ -80,6 +83,21 @@ class StreamChannelAvatar extends StatelessWidget { /// Thickness of selection image final double selectionThickness; + /// Builder to create avatar for own space channel. + /// + /// Defaults to [StreamUserAvatar]. + final StreamUserAvatarBuilder? ownSpaceAvatarBuilder; + + /// Builder to create avatar for one to one channel. + /// + /// Defaults to [StreamUserAvatar]. + final StreamUserAvatarBuilder? oneToOneAvatarBuilder; + + /// Builder to create avatar for group channel. + /// + /// Defaults to [StreamGroupAvatar]. + final StreamGroupAvatarBuilder? groupAvatarBuilder; + @override Widget build(BuildContext context) { final client = channel.client.state; @@ -146,15 +164,22 @@ class StreamChannelAvatar extends StatelessWidget { return BetterStreamBuilder( stream: client.currentUserStream.map((it) => it!), initialData: currentUser, - builder: (context, user) => StreamUserAvatar( - borderRadius: borderRadius ?? previewTheme?.borderRadius, - user: user, - constraints: constraints ?? previewTheme?.constraints, - onTap: onTap != null ? (_) => onTap!() : null, - selected: selected, - selectionColor: selectionColor ?? colorTheme.accentPrimary, - selectionThickness: selectionThickness, - ), + builder: (context, user) { + final ownSpaceBuilder = ownSpaceAvatarBuilder; + if (ownSpaceBuilder != null) { + return ownSpaceBuilder(context, user, selected); + } + + return StreamUserAvatar( + borderRadius: borderRadius ?? previewTheme?.borderRadius, + user: user, + constraints: constraints ?? previewTheme?.constraints, + onTap: onTap != null ? (_) => onTap!() : null, + selected: selected, + selectionColor: selectionColor ?? colorTheme.accentPrimary, + selectionThickness: selectionThickness, + ); + }, ); } @@ -169,18 +194,30 @@ class StreamChannelAvatar extends StatelessWidget { ), ), initialData: member, - builder: (context, member) => StreamUserAvatar( - borderRadius: borderRadius ?? previewTheme?.borderRadius, - user: member.user!, - constraints: constraints ?? previewTheme?.constraints, - onTap: onTap != null ? (_) => onTap!() : null, - selected: selected, - selectionColor: selectionColor ?? colorTheme.accentPrimary, - selectionThickness: selectionThickness, - ), + builder: (context, member) { + final oneToOneBuilder = oneToOneAvatarBuilder; + if (oneToOneBuilder != null) { + return oneToOneBuilder(context, member.user!, selected); + } + + return StreamUserAvatar( + borderRadius: borderRadius ?? previewTheme?.borderRadius, + user: member.user!, + constraints: constraints ?? previewTheme?.constraints, + onTap: onTap != null ? (_) => onTap!() : null, + selected: selected, + selectionColor: selectionColor ?? colorTheme.accentPrimary, + selectionThickness: selectionThickness, + ); + }, ); } + final groupBuilder = groupAvatarBuilder; + if (groupBuilder != null) { + return groupBuilder(context, otherMembers, selected); + } + // Group conversation return StreamGroupAvatar( channel: channel, From 816f4a2243d40c01859d58800e87920e8f3bc607 Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Mon, 19 Jun 2023 15:24:45 +0530 Subject: [PATCH 2/2] chore: update CHANGELOG.md Signed-off-by: xsahil03x --- packages/stream_chat_flutter/CHANGELOG.md | 28 +++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/packages/stream_chat_flutter/CHANGELOG.md b/packages/stream_chat_flutter/CHANGELOG.md index 268cf593..b3d7c0af 100644 --- a/packages/stream_chat_flutter/CHANGELOG.md +++ b/packages/stream_chat_flutter/CHANGELOG.md @@ -52,6 +52,34 @@ ) ``` +- Added support for `StreamChannelAvatar.ownSpaceAvatarBuilder`, `StreamChannelAvatar.oneToOneAvatarBuilder` and + `StreamChannelAvatar.groupAvatarBuilder` to override the default avatar + widget.[#1614](https://github.com/GetStream/stream-chat-flutter/issues/1614) + + ```dart + StreamChannelAvatar( + ..., + ownSpaceAvatarBuilder: (context, channel) { + return Container( + color: Colors.red, + child: Text('Own Space Avatar'), + ); + }, + oneToOneAvatarBuilder: (context, channel) { + return Container( + color: Colors.red, + child: Text('One to One Avatar'), + ); + }, + groupAvatarBuilder: (context, channel) { + return Container( + color: Colors.red, + child: Text('Group Avatar'), + ); + }, + ) + ``` + ## 6.3.0 🐞 Fixed