diff --git a/lib/widgets/avatar.dart b/lib/widgets/avatar.dart index e55b9cb17..31a523fa3 100644 --- a/lib/widgets/avatar.dart +++ b/lib/widgets/avatar.dart @@ -60,37 +60,38 @@ class Avatar extends StatelessWidget { side: border ?? BorderSide.none, ), clipBehavior: Clip.antiAlias, - child: noPic - ? Container( - decoration: BoxDecoration(color: name?.lightColorAvatar), - alignment: Alignment.center, - child: Text( - fallbackLetters, - textAlign: TextAlign.center, - style: TextStyle( - fontFamily: 'RobotoMono', - color: Colors.white, - fontWeight: FontWeight.bold, - fontSize: (size / 2.5).roundToDouble(), + child: MxcImage( + client: client, + borderRadius: borderRadius, + key: ValueKey(mxContent.toString()), + cacheKey: '${mxContent}_$size', + uri: mxContent, + fit: BoxFit.cover, + width: size, + height: size, + placeholder: (_) => noPic + ? Container( + decoration: BoxDecoration(color: name?.lightColorAvatar), + alignment: Alignment.center, + child: Text( + fallbackLetters, + textAlign: TextAlign.center, + style: TextStyle( + fontFamily: 'RobotoMono', + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: (size / 2.5).roundToDouble(), + ), ), - ), - ) - : MxcImage( - client: client, - key: ValueKey(mxContent.toString()), - cacheKey: '${mxContent}_$size', - uri: mxContent, - fit: BoxFit.cover, - width: size, - height: size, - placeholder: (_) => Center( + ) + : Center( child: Icon( Icons.person_2, color: theme.colorScheme.tertiary, size: size / 1.5, ), ), - ), + ), ), ), if (presenceUserId != null) diff --git a/lib/widgets/mxc_image.dart b/lib/widgets/mxc_image.dart index 70c558da9..1572fa6b9 100644 --- a/lib/widgets/mxc_image.dart +++ b/lib/widgets/mxc_image.dart @@ -26,6 +26,7 @@ class MxcImage extends StatefulWidget { final Widget Function(BuildContext context)? placeholder; final String? cacheKey; final Client? client; + final BorderRadius borderRadius; const MxcImage({ this.uri, @@ -42,6 +43,7 @@ class MxcImage extends StatefulWidget { this.thumbnailMethod = ThumbnailMethod.scale, this.cacheKey, this.client, + this.borderRadius = BorderRadius.zero, super.key, }); @@ -141,30 +143,34 @@ class _MxcImageState extends State { final hasData = data != null && data.isNotEmpty; return AnimatedSwitcher( - duration: const Duration(milliseconds: 128), + duration: FluffyThemes.animationDuration, child: hasData - ? Image.memory( - data, - width: widget.width, - height: widget.height, - fit: widget.fit, - filterQuality: - widget.isThumbnail ? FilterQuality.low : FilterQuality.medium, - errorBuilder: (context, e, s) { - Logs().d('Unable to render mxc image', e, s); - return SizedBox( - width: widget.width, - height: widget.height, - child: Material( - color: Theme.of(context).colorScheme.surfaceContainer, - child: Icon( - Icons.broken_image_outlined, - size: min(widget.height ?? 64, 64), - color: Theme.of(context).colorScheme.onSurface, + ? ClipRRect( + borderRadius: widget.borderRadius, + child: Image.memory( + data, + width: widget.width, + height: widget.height, + fit: widget.fit, + filterQuality: widget.isThumbnail + ? FilterQuality.low + : FilterQuality.medium, + errorBuilder: (context, e, s) { + Logs().d('Unable to render mxc image', e, s); + return SizedBox( + width: widget.width, + height: widget.height, + child: Material( + color: Theme.of(context).colorScheme.surfaceContainer, + child: Icon( + Icons.broken_image_outlined, + size: min(widget.height ?? 64, 64), + color: Theme.of(context).colorScheme.onSurface, + ), ), - ), - ); - }, + ); + }, + ), ) : placeholder(context), );