From 1abc897c451c8b5bbff3792509a7fef9d12f2ce3 Mon Sep 17 00:00:00 2001 From: 21pages Date: Thu, 5 Mar 2026 12:30:40 +0800 Subject: [PATCH] fix avatar fallback (#14458) * fix avatar fallback Signed-off-by: 21pages * fix(ui): improve avatar fallback handling and layout consistency - Always show spacing in account section regardless of avatar presence - Handle null return from buildAvatarWidget with proper fallback - Adjust mobile settings avatar size to 28 Signed-off-by: 21pages --------- Signed-off-by: 21pages --- flutter/lib/desktop/pages/desktop_setting_page.dart | 2 +- flutter/lib/desktop/pages/server_page.dart | 11 ++++++----- flutter/lib/mobile/pages/server_page.dart | 12 ++++++------ flutter/lib/mobile/pages/settings_page.dart | 12 ++++++++---- 4 files changed, 21 insertions(+), 16 deletions(-) diff --git a/flutter/lib/desktop/pages/desktop_setting_page.dart b/flutter/lib/desktop/pages/desktop_setting_page.dart index bde40cf19..82212d191 100644 --- a/flutter/lib/desktop/pages/desktop_setting_page.dart +++ b/flutter/lib/desktop/pages/desktop_setting_page.dart @@ -2039,7 +2039,7 @@ class _AccountState extends State<_Account> { return Row( children: [ if (avatarWidget != null) avatarWidget, - if (avatarWidget != null) const SizedBox(width: 12), + const SizedBox(width: 12), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/flutter/lib/desktop/pages/server_page.dart b/flutter/lib/desktop/pages/server_page.dart index ea37c95e4..7d48452a8 100644 --- a/flutter/lib/desktop/pages/server_page.dart +++ b/flutter/lib/desktop/pages/server_page.dart @@ -569,11 +569,12 @@ class _CmHeaderState extends State<_CmHeader> Widget _buildClientAvatar() { return buildAvatarWidget( - avatar: client.avatar, - size: 70, - borderRadius: 15, - fallback: _buildInitialAvatar(), - )!; + avatar: client.avatar, + size: 70, + borderRadius: 15, + fallback: _buildInitialAvatar(), + ) ?? + _buildInitialAvatar(); } Widget _buildInitialAvatar() { diff --git a/flutter/lib/mobile/pages/server_page.dart b/flutter/lib/mobile/pages/server_page.dart index d0a7b573e..54406ff2e 100644 --- a/flutter/lib/mobile/pages/server_page.dart +++ b/flutter/lib/mobile/pages/server_page.dart @@ -857,16 +857,16 @@ class ClientInfo extends StatelessWidget { Widget _buildAvatar(BuildContext context) { final fallback = CircleAvatar( - backgroundColor: str2color( - client.name, + backgroundColor: str2color(client.name, Theme.of(context).brightness == Brightness.light ? 255 : 150), child: Text(client.name.isNotEmpty ? client.name[0] : '?'), ); return buildAvatarWidget( - avatar: client.avatar, - size: 40, - fallback: fallback, - )!; + avatar: client.avatar, + size: 40, + fallback: fallback, + ) ?? + fallback; } } diff --git a/flutter/lib/mobile/pages/settings_page.dart b/flutter/lib/mobile/pages/settings_page.dart index e047344ae..509260636 100644 --- a/flutter/lib/mobile/pages/settings_page.dart +++ b/flutter/lib/mobile/pages/settings_page.dart @@ -617,7 +617,7 @@ class _SettingsState extends State with WidgetsBindingObserver { onToggle: (bool v) async { await mainSetLocalBoolOption(kOptionEnableShowTerminalExtraKeys, v); final newValue = - mainGetLocalBoolOptionSync(kOptionEnableShowTerminalExtraKeys); + mainGetLocalBoolOptionSync(kOptionEnableShowTerminalExtraKeys); setState(() { _showTerminalExtraKeys = newValue; }); @@ -694,7 +694,9 @@ class _SettingsState extends State with WidgetsBindingObserver { avatar: gFFI.userModel.avatar.value); return buildAvatarWidget( avatar: avatar, - size: 40, + size: 28, + borderRadius: null, + fallback: Icon(Icons.person), ) ?? Icon(Icons.person); }), @@ -837,10 +839,12 @@ class _SettingsState extends State with WidgetsBindingObserver { ), if (!incomingOnly) SettingsTile.switchTile( - title: Text(translate('keep-awake-during-outgoing-sessions-label')), + title: + Text(translate('keep-awake-during-outgoing-sessions-label')), initialValue: _preventSleepWhileConnected, onToggle: (v) async { - await mainSetLocalBoolOption(kOptionKeepAwakeDuringOutgoingSessions, v); + await mainSetLocalBoolOption( + kOptionKeepAwakeDuringOutgoingSessions, v); setState(() { _preventSleepWhileConnected = v; });