From 8842d2cac9d2ce65233e412217fcf9455e60aae0 Mon Sep 17 00:00:00 2001 From: Jolie <> Date: Fri, 14 Nov 2025 16:07:28 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=A6=96=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/controller/home/home_controller.dart | 120 ++++++++++++++--------- lib/network/home_api.dart | 6 +- lib/network/home_api.g.dart | 39 +++++--- lib/network/response_model.dart | 49 ++++----- pubspec.lock | 2 +- 5 files changed, 125 insertions(+), 91 deletions(-) diff --git a/lib/controller/home/home_controller.dart b/lib/controller/home/home_controller.dart index cc9ab2e..c772c32 100644 --- a/lib/controller/home/home_controller.dart +++ b/lib/controller/home/home_controller.dart @@ -56,17 +56,19 @@ class HomeController extends GetxController { recommendHasMore.value = true; // 获取推荐数据 (type=0) - final List items = await _fetchMarriageData( - page: 1, + final result = await _fetchMarriageData( + pageNum: 1, type: 0, ); // 重置并更新推荐列表 recommendFeed.clear(); - recommendFeed.addAll(items); + recommendFeed.addAll(result['records']); - // 根据实际获取的数据量判断是否还有更多数据 - recommendHasMore.value = items.length >= pageSize; + // 根据返回的分页信息判断是否还有更多数据 + final int currentPage = result['current'] ?? 1; + final int totalPages = result['pages'] ?? 1; + recommendHasMore.value = currentPage < totalPages; } catch (e) { _handleError('获取推荐列表异常', e, '推荐列表加载失败,请稍后重试'); } finally { @@ -84,17 +86,19 @@ class HomeController extends GetxController { nearbyHasMore.value = true; // 获取同城数据 (type=1) - final List items = await _fetchMarriageData( - page: 1, + final result = await _fetchMarriageData( + pageNum: 1, type: 1, ); // 重置并更新同城列表 nearbyFeed.clear(); - nearbyFeed.addAll(items); + nearbyFeed.addAll(result['records']); - // 根据实际获取的数据量判断是否还有更多数据 - nearbyHasMore.value = items.length >= pageSize; + // 根据返回的分页信息判断是否还有更多数据 + final int currentPage = result['current'] ?? 1; + final int totalPages = result['pages'] ?? 1; + nearbyHasMore.value = currentPage < totalPages; } catch (e) { _handleError('获取同城列表异常', e, '同城列表加载失败,请稍后重试'); } finally { @@ -124,16 +128,18 @@ class HomeController extends GetxController { recommendPage.value++; // 获取推荐数据 (type=0) - final List items = await _fetchMarriageData( - page: recommendPage.value, + final result = await _fetchMarriageData( + pageNum: recommendPage.value, type: 0, ); // 更新推荐列表 - recommendFeed.addAll(items); + recommendFeed.addAll(result['records']); - // 根据实际获取的数据量判断是否还有更多数据 - recommendHasMore.value = items.length >= pageSize; + // 根据返回的分页信息判断是否还有更多数据 + final int currentPage = result['current'] ?? recommendPage.value; + final int totalPages = result['pages'] ?? recommendPage.value; + recommendHasMore.value = currentPage < totalPages; } catch (e) { recommendPage.value--; // 回退页码 _handleError('加载推荐更多异常', e, '加载更多失败'); @@ -151,16 +157,18 @@ class HomeController extends GetxController { nearbyPage.value++; // 获取同城数据 (type=1) - final List items = await _fetchMarriageData( - page: nearbyPage.value, + final result = await _fetchMarriageData( + pageNum: nearbyPage.value, type: 1, ); // 更新同城列表 - nearbyFeed.addAll(items); + nearbyFeed.addAll(result['records']); - // 根据实际获取的数据量判断是否还有更多数据 - nearbyHasMore.value = items.length >= pageSize; + // 根据返回的分页信息判断是否还有更多数据 + final int currentPage = result['current'] ?? nearbyPage.value; + final int totalPages = result['pages'] ?? nearbyPage.value; + nearbyHasMore.value = currentPage < totalPages; } catch (e) { nearbyPage.value--; // 回退页码 _handleError('加载同城更多异常', e, '加载更多失败'); @@ -192,17 +200,19 @@ class HomeController extends GetxController { recommendHasMore.value = true; // 获取推荐数据 (type=0) - final List items = await _fetchMarriageData( - page: 1, + final result = await _fetchMarriageData( + pageNum: 1, type: 0, ); // 更新推荐列表 recommendFeed.clear(); - recommendFeed.addAll(items); + recommendFeed.addAll(result['records']); - // 根据实际获取的数据量判断是否还有更多数据 - recommendHasMore.value = items.length >= pageSize; + // 根据返回的分页信息判断是否还有更多数据 + final int currentPage = result['current'] ?? 1; + final int totalPages = result['pages'] ?? 1; + recommendHasMore.value = currentPage < totalPages; } catch (e) { _handleError('刷新推荐数据异常', e, '刷新失败,请稍后重试'); } finally { @@ -220,17 +230,19 @@ class HomeController extends GetxController { nearbyHasMore.value = true; // 获取同城数据 (type=1) - final List items = await _fetchMarriageData( - page: 1, + final result = await _fetchMarriageData( + pageNum: 1, type: 1, ); // 更新同城列表 nearbyFeed.clear(); - nearbyFeed.addAll(items); + nearbyFeed.addAll(result['records']); - // 根据实际获取的数据量判断是否还有更多数据 - nearbyHasMore.value = items.length >= pageSize; + // 根据返回的分页信息判断是否还有更多数据 + final int currentPage = result['current'] ?? 1; + final int totalPages = result['pages'] ?? 1; + nearbyHasMore.value = currentPage < totalPages; } catch (e) { _handleError('刷新同城数据异常', e, '刷新失败,请稍后重试'); } finally { @@ -252,39 +264,49 @@ class HomeController extends GetxController { } /// 私有方法:获取婚姻数据(统一的数据获取逻辑) - Future> _fetchMarriageData({ - required int page, + /// 返回包含records(数据列表)、current(当前页)、pages(总页数)的Map + Future> _fetchMarriageData({ + required int pageNum, required int type, }) async { try { // 调用API获取数据 var response = await _homeApi.getMarriageList( - page: page, + pageNum: pageNum, pageSize: pageSize, type: type, ); - if (response.data.isSuccess && response.data.data != null) { - // 根据API返回结构解析数据 - final data = response.data.data; + if (response.data.isSuccess) { + final paginatedData = response.data.data; - // 检查data是否包含列表数据 - if (data is List) { - // 如果data直接是列表,直接映射为MarriageData - return data.map((item) => MarriageData.fromJson(item as Map)).toList(); - } else if (data is Map) { - // 如果data是对象,检查是否有list或records字段 - final listData = data['list'] ?? data['records']; - if (listData is List) { - return listData.map((item) => MarriageData.fromJson(item as Map)).toList(); - } + // 检查data是否为空 + if (paginatedData == null) { + return { + 'records': [], + 'current': pageNum, + 'pages': 1, + 'total': 0, + 'size': pageSize, + }; } - // 如果无法解析为有效列表,返回空列表 - return []; + // data 是 PaginatedResponse,直接使用其属性 + // records 中的每个项是 dynamic,需要转换为 MarriageData + final records = paginatedData.records + .map((item) => MarriageData.fromJson(item as Map)) + .toList(); + + return { + 'records': records, + 'current': paginatedData.current, + 'pages': paginatedData.pages, + 'total': paginatedData.total, + 'size': paginatedData.size, + }; } else { // 响应失败,抛出异常 - throw Exception(response.data.message ?? '获取数据失败'); + throw Exception(response.data.message); } } catch (e) { // 向上抛出异常,让调用方处理 diff --git a/lib/network/home_api.dart b/lib/network/home_api.dart index a36fb56..1663b10 100644 --- a/lib/network/home_api.dart +++ b/lib/network/home_api.dart @@ -11,12 +11,12 @@ abstract class HomeApi { factory HomeApi(Dio dio) = _HomeApi; /// 获取用户列表 - /// [page] - 页码 + /// [pageNum] - 页码 /// [pageSize] - 每页数量 /// [type] - 类型:0-推荐,1-同城 @GET(ApiUrls.getMarriageList) - Future>> getMarriageList({ - @Query('page') required int page, + Future>>> getMarriageList({ + @Query('pageNum') required int pageNum, @Query('pageSize') required int pageSize, @Query('type') required int type, }); diff --git a/lib/network/home_api.g.dart b/lib/network/home_api.g.dart index 8934e10..81156a1 100644 --- a/lib/network/home_api.g.dart +++ b/lib/network/home_api.g.dart @@ -20,35 +20,42 @@ class _HomeApi implements HomeApi { final ParseErrorLogger? errorLogger; @override - Future>> getMarriageList({ - required int page, + Future>>> + getMarriageList({ + required int pageNum, required int pageSize, required int type, }) async { final _extra = {}; final queryParameters = { - r'page': page, + r'pageNum': pageNum, r'pageSize': pageSize, r'type': type, }; final _headers = {}; const Map? _data = null; - final _options = _setStreamType>>( - Options(method: 'GET', headers: _headers, extra: _extra) - .compose( - _dio.options, - 'dating-agency-service/user/page/dongwo/marriage-information', - queryParameters: queryParameters, - data: _data, - ) - .copyWith(baseUrl: _combineBaseUrls(_dio.options.baseUrl, baseUrl)), - ); + final _options = + _setStreamType>>>( + Options(method: 'GET', headers: _headers, extra: _extra) + .compose( + _dio.options, + 'dating-agency-service/user/page/dongwo/marriage-information', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls(_dio.options.baseUrl, baseUrl), + ), + ); final _result = await _dio.fetch>(_options); - late BaseResponse _value; + late BaseResponse> _value; try { - _value = BaseResponse.fromJson( + _value = BaseResponse>.fromJson( _result.data!, - (json) => json as dynamic, + (json) => PaginatedResponse.fromJson( + json as Map, + (json) => json as dynamic, + ), ); } on Object catch (e, s) { errorLogger?.logError(e, s, _options); diff --git a/lib/network/response_model.dart b/lib/network/response_model.dart index 31150da..8f93913 100644 --- a/lib/network/response_model.dart +++ b/lib/network/response_model.dart @@ -41,52 +41,57 @@ class BaseResponse { /// 分页响应模型 class PaginatedResponse { - final List list; - final int total; - final int page; - final int pageSize; - final bool hasMore; + final List records; // 数据列表 + final int total; // 总记录数 + final int size; // 每页大小 + final int current; // 当前页码 + final int pages; // 总页数 PaginatedResponse({ - required this.list, + required this.records, required this.total, - required this.page, - required this.pageSize, - this.hasMore = false, + required this.size, + required this.current, + required this.pages, }); + /// 是否还有更多数据 + bool get hasMore => current < pages; + factory PaginatedResponse.fromJson( Map json, T Function(dynamic) fromJsonT, ) { - final list = []; - if (json['list'] != null && json['list'] is List) { - for (final item in json['list']) { - list.add(fromJsonT(item)); + final records = []; + // 支持 records 或 list 字段名 + final listData = json['records'] ?? json['list']; + if (listData != null && listData is List) { + for (final item in listData) { + records.add(fromJsonT(item)); } } return PaginatedResponse( - list: list, + records: records, total: json['total'] ?? 0, - page: json['page'] ?? 1, - pageSize: json['pageSize'] ?? 10, - hasMore: json['hasMore'] ?? false, + size: json['size'] ?? json['pageSize'] ?? 10, + current: json['current'] ?? json['page'] ?? 1, + pages: json['pages'] ?? 1, ); } Map toJson(Object Function(T) toJsonT) { return { - 'records': list.map((e) => toJsonT(e)).toList(), + 'records': records.map((e) => toJsonT(e)).toList(), 'total': total, - 'page': page, - 'pageSize': pageSize, - 'hasMore': hasMore, + 'size': size, + 'current': current, + 'pages': pages, }; } @override String toString() { - return 'PaginatedResponse{list: $list, total: $total, page: $page, pageSize: $pageSize, hasMore: $hasMore}'; + return 'PaginatedResponse{records: ${records.length} items, total: $total, current: $current, pages: $pages, size: $size}'; } } \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index b0f7ec4..6c77096 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1583,7 +1583,7 @@ packages: description: name: video_thumbnail sha256: "181a0c205b353918954a881f53a3441476b9e301641688a581e0c13f00dc588b" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.5.6" visibility_detector: