Skip to content

Commit

Permalink
feat: 스크롤 끝에 닿을때마다 프로필 카드 추가 기능 구현
Browse files Browse the repository at this point in the history
  • Loading branch information
changhwan77 committed Feb 6, 2024
1 parent fc675cd commit 396e558
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 18 deletions.
41 changes: 37 additions & 4 deletions lib/features/profile/services/member_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,47 @@ class MemberService {
final Dio _dio;
MemberService(this._dio);

Future<List<MemberModel>> getMembers(BuildContext context, int page) async {
Future<Map<String, dynamic>> initialGetMembers(BuildContext context) async {
try {
final response = await _dio.get('${StringConstants.baseUrl}/home');
if (response.data['code'] == 200) {
final List<dynamic> result = response.data['data']['members'];
final int lastMemberId = response.data['data']['last'];
final bool hasNext = response.data['data']['hasNext'];
final members = result.map((e) => MemberModel.fromJson(e)).toList();
final Map<String, dynamic> homeData = {
'members': members,
'last': lastMemberId,
'hasNext': hasNext,
};
return homeData;
} else {
if (context.mounted) {
HttpErrorHandler(context, response.data).handleResponse();
}
}
} catch (e) {
Logger().e("getMembers : ${e.toString()}");
}
return {};
}

Future<Map<String, dynamic>> scrollGetMembers(
BuildContext context, int memberId) async {
try {
final response =
await _dio.get('${StringConstants.baseUrl}/home?page=$page');
await _dio.get('${StringConstants.baseUrl}/home?last=$memberId');
if (response.data['code'] == 200) {
final List<dynamic> result = response.data['data']['members'];
final int lastMemberId = response.data['data']['last'];
final bool hasNext = response.data['data']['hasNext'];
final members = result.map((e) => MemberModel.fromJson(e)).toList();
return members;
final Map<String, dynamic> homeData = {
'members': members,
'last': lastMemberId,
'hasNext': hasNext,
};
return homeData;
} else {
if (context.mounted) {
HttpErrorHandler(context, response.data).handleResponse();
Expand All @@ -28,7 +61,7 @@ class MemberService {
} catch (e) {
Logger().e("getMembers : ${e.toString()}");
}
return [];
return {};
}
}

Expand Down
44 changes: 30 additions & 14 deletions lib/features/tutis/widgets/tuti_widgets/tuti_card_mobile.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,9 @@ class TuTiCardMobile extends ConsumerStatefulWidget {

class _TuTiCardMobileState extends ConsumerState<TuTiCardMobile> {
late ScrollController _scrollController;
int _page = 0;
List<MemberModel> _allMembers = [];
final List<MemberModel> _allMembers = [];
final List<int> _lastMemberIds = [];
final List<bool> _hasNextPages = [];

@override
void initState() {
Expand All @@ -36,35 +37,50 @@ class _TuTiCardMobileState extends ConsumerState<TuTiCardMobile> {
}

Future<void> _initializeMemberData() async {
await getMembersBuilder(page: _page);
}

Future<List<MemberModel>> getMembersBuilder({required int page}) async {
final memberService = ref.read(memberServiceProvider);
print(page);
final members = await memberService.getMembers(context, page);
final homeData = await memberService.initialGetMembers(context);
final members = homeData['members'];
final lastMemberId = homeData['last'];
final bool hasNext = homeData['hasNext'];
_lastMemberIds.add(lastMemberId);
_hasNextPages.add(hasNext);

if (members.isNotEmpty) {
setState(() {
_allMembers.addAll(members);
});
}

return _allMembers;
}

void _scrollListener() {
// 리스트의 맨 아래에 도달했을 때
if (_scrollController.position.pixels ==
_scrollController.position.maxScrollExtent) {
//서버에서 받아온 멤버 객체가 10의 배수일 때만 서버의 다음 페이지에 대한 멤버 정보를 받아옴.
if (_allMembers.length % 10 == 0) {
_page++;
getMembersBuilder(page: _page);
print(_hasNextPages.last);
if (_hasNextPages.last == true) {
getMembersBuilder();
}
}
}

Future<void> getMembersBuilder() async {
final memberService = ref.read(memberServiceProvider);
print(_lastMemberIds.last);
final homeData =
await memberService.scrollGetMembers(context, _lastMemberIds.last);
final members = homeData['members'];
final lastMemberId = homeData['last'];
final bool hasNext = homeData['hasNext'];
_lastMemberIds.add(lastMemberId);
_hasNextPages.add(hasNext);

if (members.isNotEmpty) {
setState(() {
_allMembers.addAll(members);
});
}
}

@override
Widget build(BuildContext context) {
return Expanded(
Expand Down

0 comments on commit 396e558

Please sign in to comment.