diff --git a/packages/stream_chat_flutter/lib/src/channel_avatar.dart b/packages/stream_chat_flutter/lib/src/channel_avatar.dart index a2390e81..ace5f310 100644 --- a/packages/stream_chat_flutter/lib/src/channel_avatar.dart +++ b/packages/stream_chat_flutter/lib/src/channel_avatar.dart @@ -90,56 +90,54 @@ class ChannelAvatar extends StatelessWidget { final colorTheme = chatThemeData.colorTheme; final previewTheme = chatThemeData.channelPreviewTheme.avatarTheme; - return StreamBuilder( + return BetterStreamBuilder( stream: channel.imageStream, initialData: channel.image, - builder: (context, snapshot) { - final channelImage = snapshot.data; - if (channelImage != null) { - Widget child = ClipRRect( - borderRadius: borderRadius ?? previewTheme?.borderRadius, - child: Container( - constraints: constraints ?? previewTheme?.constraints, - decoration: BoxDecoration(color: colorTheme.accentPrimary), - child: InkWell( - onTap: onTap, - child: CachedNetworkImage( - imageUrl: channelImage, - errorWidget: (_, __, ___) => Center( - child: Text( - channel.name?[0] ?? '', - style: TextStyle( - color: colorTheme.barsBg, - fontWeight: FontWeight.bold, - ), + builder: (context, channelImage) { + Widget child = ClipRRect( + borderRadius: borderRadius ?? previewTheme?.borderRadius, + child: Container( + constraints: constraints ?? previewTheme?.constraints, + decoration: BoxDecoration(color: colorTheme.accentPrimary), + child: InkWell( + onTap: onTap, + child: CachedNetworkImage( + imageUrl: channelImage, + errorWidget: (_, __, ___) => Center( + child: Text( + channel.name?[0] ?? '', + style: TextStyle( + color: colorTheme.barsBg, + fontWeight: FontWeight.bold, ), ), - fit: BoxFit.cover, ), + fit: BoxFit.cover, + ), + ), + ), + ); + + if (selected) { + child = ClipRRect( + key: const Key('selectedImage'), + borderRadius: BorderRadius.circular(selectionThickness) + + (borderRadius ?? + previewTheme?.borderRadius ?? + BorderRadius.zero), + child: Container( + constraints: constraints ?? previewTheme?.constraints, + color: selectionColor ?? colorTheme.accentPrimary, + child: Padding( + padding: EdgeInsets.all(selectionThickness), + child: child, ), ), ); - - if (selected) { - child = ClipRRect( - key: const Key('selectedImage'), - borderRadius: BorderRadius.circular(selectionThickness) + - (borderRadius ?? - previewTheme?.borderRadius ?? - BorderRadius.zero), - child: Container( - constraints: constraints ?? previewTheme?.constraints, - color: selectionColor ?? colorTheme.accentPrimary, - child: Padding( - padding: EdgeInsets.all(selectionThickness), - child: child, - ), - ), - ); - } - return child; } - + return child; + }, + noDataBuilder: (context) { final currentUser = streamChat.currentUser!; final otherMembers = channel.state!.members .where((it) => it.userId != currentUser.id) diff --git a/packages/stream_chat_flutter/lib/src/channel_name.dart b/packages/stream_chat_flutter/lib/src/channel_name.dart index 6fb76d82..918aa076 100644 --- a/packages/stream_chat_flutter/lib/src/channel_name.dart +++ b/packages/stream_chat_flutter/lib/src/channel_name.dart @@ -29,33 +29,39 @@ class ChannelName extends StatelessWidget { assert(channel.state != null, 'Channel ${channel.id} is not initialized'); - return StreamBuilder( + return BetterStreamBuilder( stream: channel.nameStream, initialData: channel.name, - builder: (context, snapshot) => _buildName( - snapshot.data, + builder: (context, channelName) => Text( + channelName, + style: textStyle, + overflow: textOverflow, + ), + noDataBuilder: (context) => _generateName( + client.currentUser!, channel.state!.members, - client, ), ); } - Widget _buildName( - String? name, + Widget _generateName( + User currentUser, List members, - StreamChatState client, ) => LayoutBuilder( builder: (context, constraints) { - var title = name; - if (title == null && members.isNotEmpty) { - final otherMembers = members - .where((member) => member.userId != client.currentUser!.id); + var channelName = context.translations.noTitleText; + final otherMembers = members.where( + (member) => member.userId != currentUser.id, + ); + + if (otherMembers.isNotEmpty) { if (otherMembers.length == 1) { - if (otherMembers.first.user != null) { - title = otherMembers.first.user!.name; + final user = otherMembers.first.user; + if (user != null) { + channelName = user.name; } - } else if (otherMembers.isNotEmpty == true) { + } else { final maxWidth = constraints.maxWidth; final maxChars = maxWidth / (textStyle?.fontSize ?? 1); var currentChars = 0; @@ -71,13 +77,14 @@ class ChannelName extends StatelessWidget { final exceedingMembers = otherMembers.length - currentMembers.length; - title = '${currentMembers.map((e) => e.user?.name).join(', ')} ' + channelName = + '${currentMembers.map((e) => e.user?.name).join(', ')} ' '${exceedingMembers > 0 ? '+ $exceedingMembers' : ''}'; } } return Text( - title ?? context.translations.noTitleText, + channelName, style: textStyle, overflow: textOverflow, );