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:
parent
d05ff9ee17
commit
1f852d1fca
|
|
@ -1,7 +1,9 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
|
import '../../../../core/di/injection_container.dart';
|
||||||
import '../../../../routes/route_paths.dart';
|
import '../../../../routes/route_paths.dart';
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
|
|
@ -15,9 +17,10 @@ class ProfilePage extends ConsumerStatefulWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class _ProfilePageState extends ConsumerState<ProfilePage> {
|
class _ProfilePageState extends ConsumerState<ProfilePage> {
|
||||||
// 模拟用户数据
|
// 用户数据(从存储加载)
|
||||||
final String _nickname = '用户昵称';
|
String _nickname = '加载中...';
|
||||||
final String _serialNumber = '12345678';
|
String _serialNumber = '--';
|
||||||
|
String? _avatarSvg;
|
||||||
final String _referrerSerial = '87654321';
|
final String _referrerSerial = '87654321';
|
||||||
final String _community = '星空社区';
|
final String _community = '星空社区';
|
||||||
final String _parentCommunity = '银河社区';
|
final String _parentCommunity = '银河社区';
|
||||||
|
|
@ -58,6 +61,24 @@ class _ProfilePageState extends ConsumerState<ProfilePage> {
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
_startCountdown();
|
_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
|
@override
|
||||||
|
|
@ -261,17 +282,18 @@ class _ProfilePageState extends ConsumerState<ProfilePage> {
|
||||||
),
|
),
|
||||||
child: ClipRRect(
|
child: ClipRRect(
|
||||||
borderRadius: BorderRadius.circular(40),
|
borderRadius: BorderRadius.circular(40),
|
||||||
child: Image.asset(
|
child: _avatarSvg != null
|
||||||
'assets/images/Button@2x.png',
|
? SvgPicture.string(
|
||||||
fit: BoxFit.cover,
|
_avatarSvg!,
|
||||||
errorBuilder: (context, error, stackTrace) {
|
width: 80,
|
||||||
return const Icon(
|
height: 80,
|
||||||
Icons.person,
|
fit: BoxFit.cover,
|
||||||
size: 40,
|
)
|
||||||
color: Color(0xFF8B5A2B),
|
: const Icon(
|
||||||
);
|
Icons.person,
|
||||||
},
|
size: 40,
|
||||||
),
|
color: Color(0xFF8B5A2B),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue