Skip to content

Commit eea9cfb

Browse files
authored
feat: 프로필 이미지 연결 완료 (#150)
1 parent 53ef2b2 commit eea9cfb

File tree

10 files changed

+289
-108
lines changed

10 files changed

+289
-108
lines changed

frontend/ongi/lib/screens/health/family_step_tracker_screen.dart

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import '../../core/app_colors.dart';
33
import 'package:flutter_svg/flutter_svg.dart';
44
import 'package:ongi/widgets/date_carousel.dart';
55
import 'package:ongi/services/step_service.dart';
6+
import 'package:ongi/services/family_service.dart';
7+
import 'package:ongi/utils/prefs_manager.dart';
68

79
class FamilyStepTrackerScreen extends StatefulWidget {
810
const FamilyStepTrackerScreen({super.key});
@@ -54,22 +56,29 @@ class _FamilyStepTrackerScreenState extends State<FamilyStepTrackerScreen> {
5456
});
5557
try {
5658
final String dateStr = _formatDate(date);
57-
final Map<String, dynamic>? result = await _stepService.getSteps(
58-
date: dateStr,
59-
);
59+
60+
// 가족 구성원 정보와 걸음 수 정보를 동시에 가져오기
61+
final List<Future> futures = [
62+
_stepService.getSteps(date: dateStr),
63+
FamilyService.getFamilyMembers(),
64+
];
65+
66+
final results = await Future.wait(futures);
67+
final Map<String, dynamic>? stepResult = results[0] as Map<String, dynamic>?;
68+
final List<Map<String, dynamic>> familyMembers = results[1] as List<Map<String, dynamic>>;
6069

6170
int parsedTotal = 0;
6271
final List<_MemberStep> parsedMembers = [];
63-
if (result != null) {
64-
if (result['totalSteps'] is int) {
65-
parsedTotal = result['totalSteps'] as int;
66-
} else if (result['steps'] is int) {
67-
parsedTotal = result['steps'] as int;
68-
} else if (result['total'] is int) {
69-
parsedTotal = result['total'] as int;
72+
if (stepResult != null) {
73+
if (stepResult['totalSteps'] is int) {
74+
parsedTotal = stepResult['totalSteps'] as int;
75+
} else if (stepResult['steps'] is int) {
76+
parsedTotal = stepResult['steps'] as int;
77+
} else if (stepResult['total'] is int) {
78+
parsedTotal = stepResult['total'] as int;
7079
}
7180

72-
final dynamic members = result['memberSteps'];
81+
final dynamic members = stepResult['memberSteps'];
7382
if (members is List) {
7483
for (final dynamic item in members) {
7584
if (item is Map<String, dynamic>) {
@@ -78,12 +87,16 @@ class _FamilyStepTrackerScreenState extends State<FamilyStepTrackerScreen> {
7887
final int steps = (item['steps'] is int)
7988
? item['steps'] as int
8089
: int.tryParse(item['steps']?.toString() ?? '0') ?? 0;
90+
91+
// 실제 가족 구성원의 프로필 이미지 가져오기
92+
final profileImagePath = await PrefsManager.getProfileImagePathByUserId(userId, familyMembers);
93+
8194
parsedMembers.add(
8295
_MemberStep(
8396
userId: userId,
8497
userName: userName.isEmpty ? '이름없음' : userName,
8598
steps: steps,
86-
imageAsset: 'assets/images/users/elderly_woman.png',
99+
imageAsset: profileImagePath,
87100
),
88101
);
89102
}

frontend/ongi/lib/screens/home/home_ourfamily_text.dart

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'dart:ui';
22

33
import 'package:flutter/material.dart';
4+
import 'package:ongi/utils/prefs_manager.dart';
45

56
class HomeOngiText extends StatelessWidget {
67
final String username;
@@ -24,10 +25,19 @@ class HomeOngiText extends StatelessWidget {
2425
children: [
2526
Row(
2627
children: [
27-
Image.asset(
28-
'assets/images/users/elderly_woman.png',
29-
width: iconSize,
30-
height: iconSize,
28+
FutureBuilder<Map<String, dynamic>>(
29+
future: PrefsManager.getUserInfo(),
30+
builder: (context, snapshot) {
31+
final userInfo = snapshot.data ?? {};
32+
final profileImageId = userInfo['profileImageId'] ?? 0;
33+
final profileImagePath = PrefsManager.getProfileImagePath(profileImageId);
34+
35+
return Image.asset(
36+
profileImagePath,
37+
width: iconSize,
38+
height: iconSize,
39+
);
40+
},
3141
),
3242
const SizedBox(width: 8),
3343
Text(

frontend/ongi/lib/screens/mypage/mypage_myinfo.dart

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,14 @@ import 'package:flutter/services.dart';
55
import 'package:http/http.dart' as http;
66
import 'dart:convert';
77

8-
class Myinfo extends StatelessWidget {
9-
const Myinfo({Key? key}) : super(key: key);
8+
class Myinfo extends StatefulWidget {
9+
const Myinfo({super.key});
1010

11+
@override
12+
State<Myinfo> createState() => _MyinfoState();
13+
}
14+
15+
class _MyinfoState extends State<Myinfo> {
1116
Future<Map<String, String>> fetchFamilyInfo() async {
1217
final token = await PrefsManager.getAccessToken();
1318
if (token == null) throw Exception('로그인 필요');
@@ -57,14 +62,13 @@ class Myinfo extends StatelessWidget {
5762
// 기존 PrefsManager.getUserInfo()에서 불러오던 나머지 정보는 그대로 사용
5863
// (예: name, profileImage, isParent 등)
5964
// 아래는 예시로 name 등은 PrefsManager에서 계속 불러오도록 유지
60-
return FutureBuilder<Map<String, String?>>(
65+
return FutureBuilder<Map<String, dynamic>>(
6166
future: PrefsManager.getUserInfo(),
6267
builder: (context, userSnapshot) {
6368
final userInfo = userSnapshot.data ?? {};
6469
final name = userInfo['name'] ?? '사용자';
65-
final profileImage =
66-
userInfo['profileImage'] ??
67-
'assets/images/users/elderly_woman.png';
70+
final profileImageId = userInfo['profileImageId'] ?? 0;
71+
final profileImagePath = PrefsManager.getProfileImagePath(profileImageId);
6872
final isParent = userInfo['isParent'] == 'true';
6973
final roleText = isParent ? '부모' : '자녀';
7074
return Padding(
@@ -78,7 +82,7 @@ class Myinfo extends StatelessWidget {
7882
// 프로필 이미지
7983
ClipOval(
8084
child: Image.asset(
81-
profileImage,
85+
profileImagePath,
8286
width: screenWidth * 0.3, // 112/375
8387
height: screenWidth * 0.4,
8488
fit: BoxFit.contain,

frontend/ongi/lib/screens/photo/detail_record_screen.dart

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -304,11 +304,18 @@ class _DetailRecordScreenState extends State<DetailRecordScreen> {
304304
child: Row(
305305
crossAxisAlignment: CrossAxisAlignment.start,
306306
children: [
307-
CircleAvatar(
308-
radius: 22,
309-
backgroundImage: AssetImage(
310-
'assets/images/users/elderly_woman.png',
311-
),
307+
FutureBuilder<Map<String, dynamic>>(
308+
future: PrefsManager.getUserInfo(),
309+
builder: (context, snapshot) {
310+
final userInfo = snapshot.data ?? {};
311+
final profileImageId = userInfo['profileImageId'] ?? 0;
312+
final profileImagePath = PrefsManager.getProfileImagePath(profileImageId);
313+
314+
return CircleAvatar(
315+
radius: 22,
316+
backgroundImage: AssetImage(profileImagePath),
317+
);
318+
},
312319
),
313320
const SizedBox(width: 10),
314321
Expanded(

0 commit comments

Comments
 (0)