fix avatar fallback (#14458)

* fix avatar fallback

Signed-off-by: 21pages <sunboeasy@gmail.com>

* 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 <sunboeasy@gmail.com>

---------

Signed-off-by: 21pages <sunboeasy@gmail.com>
This commit is contained in:
21pages
2026-03-05 12:30:40 +08:00
committed by GitHub
parent ab64a32f30
commit 1abc897c45
4 changed files with 21 additions and 16 deletions

View File

@@ -2039,7 +2039,7 @@ class _AccountState extends State<_Account> {
return Row( return Row(
children: [ children: [
if (avatarWidget != null) avatarWidget, if (avatarWidget != null) avatarWidget,
if (avatarWidget != null) const SizedBox(width: 12), const SizedBox(width: 12),
Expanded( Expanded(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,

View File

@@ -569,11 +569,12 @@ class _CmHeaderState extends State<_CmHeader>
Widget _buildClientAvatar() { Widget _buildClientAvatar() {
return buildAvatarWidget( return buildAvatarWidget(
avatar: client.avatar, avatar: client.avatar,
size: 70, size: 70,
borderRadius: 15, borderRadius: 15,
fallback: _buildInitialAvatar(), fallback: _buildInitialAvatar(),
)!; ) ??
_buildInitialAvatar();
} }
Widget _buildInitialAvatar() { Widget _buildInitialAvatar() {

View File

@@ -857,16 +857,16 @@ class ClientInfo extends StatelessWidget {
Widget _buildAvatar(BuildContext context) { Widget _buildAvatar(BuildContext context) {
final fallback = CircleAvatar( final fallback = CircleAvatar(
backgroundColor: str2color( backgroundColor: str2color(client.name,
client.name,
Theme.of(context).brightness == Brightness.light ? 255 : 150), Theme.of(context).brightness == Brightness.light ? 255 : 150),
child: Text(client.name.isNotEmpty ? client.name[0] : '?'), child: Text(client.name.isNotEmpty ? client.name[0] : '?'),
); );
return buildAvatarWidget( return buildAvatarWidget(
avatar: client.avatar, avatar: client.avatar,
size: 40, size: 40,
fallback: fallback, fallback: fallback,
)!; ) ??
fallback;
} }
} }

View File

@@ -617,7 +617,7 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
onToggle: (bool v) async { onToggle: (bool v) async {
await mainSetLocalBoolOption(kOptionEnableShowTerminalExtraKeys, v); await mainSetLocalBoolOption(kOptionEnableShowTerminalExtraKeys, v);
final newValue = final newValue =
mainGetLocalBoolOptionSync(kOptionEnableShowTerminalExtraKeys); mainGetLocalBoolOptionSync(kOptionEnableShowTerminalExtraKeys);
setState(() { setState(() {
_showTerminalExtraKeys = newValue; _showTerminalExtraKeys = newValue;
}); });
@@ -694,7 +694,9 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
avatar: gFFI.userModel.avatar.value); avatar: gFFI.userModel.avatar.value);
return buildAvatarWidget( return buildAvatarWidget(
avatar: avatar, avatar: avatar,
size: 40, size: 28,
borderRadius: null,
fallback: Icon(Icons.person),
) ?? ) ??
Icon(Icons.person); Icon(Icons.person);
}), }),
@@ -837,10 +839,12 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
), ),
if (!incomingOnly) if (!incomingOnly)
SettingsTile.switchTile( SettingsTile.switchTile(
title: Text(translate('keep-awake-during-outgoing-sessions-label')), title:
Text(translate('keep-awake-during-outgoing-sessions-label')),
initialValue: _preventSleepWhileConnected, initialValue: _preventSleepWhileConnected,
onToggle: (v) async { onToggle: (v) async {
await mainSetLocalBoolOption(kOptionKeepAwakeDuringOutgoingSessions, v); await mainSetLocalBoolOption(
kOptionKeepAwakeDuringOutgoingSessions, v);
setState(() { setState(() {
_preventSleepWhileConnected = v; _preventSleepWhileConnected = v;
}); });