debug: add detailed logging for avatar loading

Added debug logs in:
- ProfilePage._loadUserData() - local storage data
- ProfilePage._loadMeData() - API response and sync conditions
- ProfilePage._buildAvatarContent() - avatar rendering decision
- UserApplicationService.getMe() - backend avatarUrl value

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
hailin 2025-12-09 18:24:13 -08:00
parent 8d94d9e4bb
commit a3c0d3948d
2 changed files with 48 additions and 1 deletions

View File

@ -492,9 +492,16 @@ export class UserApplicationService {
* (GET /api/me) * (GET /api/me)
*/ */
async getMe(userId: string): Promise<MeResult> { async getMe(userId: string): Promise<MeResult> {
this.logger.debug(`getMe() - userId: ${userId}`);
const account = await this.userRepository.findById(UserId.create(userId)); const account = await this.userRepository.findById(UserId.create(userId));
if (!account) throw new ApplicationError('用户不存在'); if (!account) throw new ApplicationError('用户不存在');
this.logger.debug(`getMe() - account found: seq=${account.accountSequence.value}, nickname=${account.nickname}`);
this.logger.debug(`getMe() - avatarUrl: ${account.avatarUrl ? `长度=${account.avatarUrl.length}` : 'null'}`);
if (account.avatarUrl) {
this.logger.debug(`getMe() - avatarUrl前100字符: ${account.avatarUrl.substring(0, 100)}`);
}
const baseUrl = 'https://app.rwadurian.com'; // TODO: 从配置读取 const baseUrl = 'https://app.rwadurian.com'; // TODO: 从配置读取
const referralLink = `${baseUrl}/invite/${account.referralCode.value}`; const referralLink = `${baseUrl}/invite/${account.referralCode.value}`;

View File

@ -143,6 +143,7 @@ class _ProfilePageState extends ConsumerState<ProfilePage> {
/// ///
Future<void> _loadUserData() async { Future<void> _loadUserData() async {
debugPrint('[ProfilePage] _loadUserData() - 开始加载本地存储数据...');
final accountService = ref.read(accountServiceProvider); final accountService = ref.read(accountServiceProvider);
// //
@ -162,6 +163,13 @@ class _ProfilePageState extends ConsumerState<ProfilePage> {
final localAvatarPath = results[4] as String?; final localAvatarPath = results[4] as String?;
final referralCode = results[5] as String?; final referralCode = results[5] as String?;
debugPrint('[ProfilePage] _loadUserData() - 本地存储数据:');
debugPrint('[ProfilePage] username: $username');
debugPrint('[ProfilePage] serialNum: $serialNum');
debugPrint('[ProfilePage] avatarSvg: ${avatarSvg != null ? "长度=${avatarSvg.length}" : "null"}');
debugPrint('[ProfilePage] avatarUrl: $avatarUrl');
debugPrint('[ProfilePage] localAvatarPath: $localAvatarPath');
if (mounted) { if (mounted) {
setState(() { setState(() {
_nickname = username ?? '未设置昵称'; _nickname = username ?? '未设置昵称';
@ -185,9 +193,16 @@ class _ProfilePageState extends ConsumerState<ProfilePage> {
/// API加载完整用户信息 /// API加载完整用户信息
Future<void> _loadMeData() async { Future<void> _loadMeData() async {
try { try {
debugPrint('[ProfilePage] _loadMeData() - 开始加载用户信息...');
final accountService = ref.read(accountServiceProvider); final accountService = ref.read(accountServiceProvider);
final meData = await accountService.getMe(); final meData = await accountService.getMe();
debugPrint('[ProfilePage] _loadMeData() - API返回数据:');
debugPrint('[ProfilePage] nickname: ${meData.nickname}');
debugPrint('[ProfilePage] avatarUrl: ${meData.avatarUrl != null ? "长度=${meData.avatarUrl!.length}" : "null"}');
debugPrint('[ProfilePage] avatarUrl内容前100字符: ${meData.avatarUrl?.substring(0, meData.avatarUrl!.length > 100 ? 100 : meData.avatarUrl!.length) ?? "null"}');
debugPrint('[ProfilePage] 当前_avatarSvg: ${_avatarSvg != null ? "长度=${_avatarSvg!.length}" : "null"}');
if (mounted) { if (mounted) {
setState(() { setState(() {
_referrerSerial = meData.inviterSequence?.toString() ?? ''; _referrerSerial = meData.inviterSequence?.toString() ?? '';
@ -199,15 +214,24 @@ class _ProfilePageState extends ConsumerState<ProfilePage> {
_referralCode = meData.referralCode; _referralCode = meData.referralCode;
} }
// API返回了头像 // API返回了头像
debugPrint('[ProfilePage] _loadMeData() - 检查头像同步条件:');
debugPrint('[ProfilePage] _avatarSvg == null: ${_avatarSvg == null}');
debugPrint('[ProfilePage] meData.avatarUrl != null: ${meData.avatarUrl != null}');
debugPrint('[ProfilePage] meData.avatarUrl.isNotEmpty: ${meData.avatarUrl?.isNotEmpty ?? false}');
if (_avatarSvg == null && meData.avatarUrl != null && meData.avatarUrl!.isNotEmpty) { if (_avatarSvg == null && meData.avatarUrl != null && meData.avatarUrl!.isNotEmpty) {
debugPrint('[ProfilePage] _loadMeData() - 同步头像到本地!');
_avatarSvg = meData.avatarUrl; _avatarSvg = meData.avatarUrl;
// API获取 // API获取
accountService.updateLocalAvatarSvg(meData.avatarUrl!); accountService.updateLocalAvatarSvg(meData.avatarUrl!);
} else {
debugPrint('[ProfilePage] _loadMeData() - 不需要同步头像 (条件不满足)');
} }
}); });
} }
} catch (e) { } catch (e, stackTrace) {
debugPrint('[ProfilePage] 加载用户信息失败: $e'); debugPrint('[ProfilePage] 加载用户信息失败: $e');
debugPrint('[ProfilePage] 堆栈: $stackTrace');
// //
} }
} }
@ -543,11 +567,17 @@ class _ProfilePageState extends ConsumerState<ProfilePage> {
/// URLSVG /// URLSVG
Widget _buildAvatarContent() { Widget _buildAvatarContent() {
debugPrint('[ProfilePage] _buildAvatarContent() - 开始构建头像');
debugPrint('[ProfilePage] _localAvatarPath: $_localAvatarPath');
debugPrint('[ProfilePage] _avatarUrl: $_avatarUrl');
debugPrint('[ProfilePage] _avatarSvg: ${_avatarSvg != null ? "长度=${_avatarSvg!.length}" : "null"}');
// 1. // 1.
if (_localAvatarPath != null && _localAvatarPath!.isNotEmpty) { if (_localAvatarPath != null && _localAvatarPath!.isNotEmpty) {
final file = File(_localAvatarPath!); final file = File(_localAvatarPath!);
// //
if (file.existsSync()) { if (file.existsSync()) {
debugPrint('[ProfilePage] _buildAvatarContent() - 使用本地文件: $_localAvatarPath');
return Image.file( return Image.file(
file, file,
width: 80, width: 80,
@ -555,10 +585,13 @@ class _ProfilePageState extends ConsumerState<ProfilePage> {
fit: BoxFit.cover, fit: BoxFit.cover,
gaplessPlayback: true, // gaplessPlayback: true, //
errorBuilder: (context, error, stackTrace) { errorBuilder: (context, error, stackTrace) {
debugPrint('[ProfilePage] _buildAvatarContent() - 本地文件加载失败: $error');
// URL // URL
return _buildNetworkOrSvgAvatar(); return _buildNetworkOrSvgAvatar();
}, },
); );
} else {
debugPrint('[ProfilePage] _buildAvatarContent() - 本地文件不存在');
} }
} }
@ -568,8 +601,10 @@ class _ProfilePageState extends ConsumerState<ProfilePage> {
/// URL或SVG头像 /// URL或SVG头像
Widget _buildNetworkOrSvgAvatar() { Widget _buildNetworkOrSvgAvatar() {
debugPrint('[ProfilePage] _buildNetworkOrSvgAvatar() - 尝试网络URL或SVG');
// URL // URL
if (_avatarUrl != null && _avatarUrl!.isNotEmpty) { if (_avatarUrl != null && _avatarUrl!.isNotEmpty) {
debugPrint('[ProfilePage] _buildNetworkOrSvgAvatar() - 使用网络URL: $_avatarUrl');
return Image.network( return Image.network(
_avatarUrl!, _avatarUrl!,
width: 80, width: 80,
@ -589,6 +624,7 @@ class _ProfilePageState extends ConsumerState<ProfilePage> {
); );
}, },
errorBuilder: (context, error, stackTrace) { errorBuilder: (context, error, stackTrace) {
debugPrint('[ProfilePage] _buildNetworkOrSvgAvatar() - 网络图片加载失败: $error');
// SVG或默认头像 // SVG或默认头像
return _buildSvgOrDefaultAvatar(); return _buildSvgOrDefaultAvatar();
}, },
@ -596,12 +632,15 @@ class _ProfilePageState extends ConsumerState<ProfilePage> {
} }
// SVG或默认头像 // SVG或默认头像
debugPrint('[ProfilePage] _buildNetworkOrSvgAvatar() - 无网络URL尝试SVG');
return _buildSvgOrDefaultAvatar(); return _buildSvgOrDefaultAvatar();
} }
/// SVG或默认头像 /// SVG或默认头像
Widget _buildSvgOrDefaultAvatar() { Widget _buildSvgOrDefaultAvatar() {
if (_avatarSvg != null) { if (_avatarSvg != null) {
debugPrint('[ProfilePage] _buildSvgOrDefaultAvatar() - 使用SVG头像长度=${_avatarSvg!.length}');
debugPrint('[ProfilePage] SVG前50字符: ${_avatarSvg!.substring(0, _avatarSvg!.length > 50 ? 50 : _avatarSvg!.length)}');
return SvgPicture.string( return SvgPicture.string(
_avatarSvg!, _avatarSvg!,
width: 80, width: 80,
@ -609,6 +648,7 @@ class _ProfilePageState extends ConsumerState<ProfilePage> {
fit: BoxFit.cover, fit: BoxFit.cover,
); );
} }
debugPrint('[ProfilePage] _buildSvgOrDefaultAvatar() - 无SVG使用默认图标');
return const Icon( return const Icon(
Icons.person, Icons.person,
size: 40, size: 40,