feat(mobile-app): use real user data in profile page

- Load username, serial number, and avatar from account service
- Display SVG avatar from backend instead of static image
- Show loading state while fetching user data

🤖 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-07 20:47:42 -08:00
parent d05ff9ee17
commit 1f852d1fca
1 changed files with 36 additions and 14 deletions

View File

@ -1,7 +1,9 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:go_router/go_router.dart';
import '../../../../core/di/injection_container.dart';
import '../../../../routes/route_paths.dart';
import 'dart:async';
@ -15,9 +17,10 @@ class ProfilePage extends ConsumerStatefulWidget {
}
class _ProfilePageState extends ConsumerState<ProfilePage> {
//
final String _nickname = '用户昵称';
final String _serialNumber = '12345678';
//
String _nickname = '加载中...';
String _serialNumber = '--';
String? _avatarSvg;
final String _referrerSerial = '87654321';
final String _community = '星空社区';
final String _parentCommunity = '银河社区';
@ -58,6 +61,24 @@ class _ProfilePageState extends ConsumerState<ProfilePage> {
void initState() {
super.initState();
_startCountdown();
_loadUserData();
}
///
Future<void> _loadUserData() async {
final accountService = ref.read(accountServiceProvider);
final username = await accountService.getUsername();
final serialNum = await accountService.getUserSerialNum();
final avatarSvg = await accountService.getAvatarSvg();
if (mounted) {
setState(() {
_nickname = username ?? '未设置昵称';
_serialNumber = serialNum?.toString() ?? '--';
_avatarSvg = avatarSvg;
});
}
}
@override
@ -261,17 +282,18 @@ class _ProfilePageState extends ConsumerState<ProfilePage> {
),
child: ClipRRect(
borderRadius: BorderRadius.circular(40),
child: Image.asset(
'assets/images/Button@2x.png',
fit: BoxFit.cover,
errorBuilder: (context, error, stackTrace) {
return const Icon(
Icons.person,
size: 40,
color: Color(0xFF8B5A2B),
);
},
),
child: _avatarSvg != null
? SvgPicture.string(
_avatarSvg!,
width: 80,
height: 80,
fit: BoxFit.cover,
)
: const Icon(
Icons.person,
size: 40,
color: Color(0xFF8B5A2B),
),
),
),
),