diff --git a/lib/controller/mine/my_friend_controller.dart b/lib/controller/mine/my_friend_controller.dart index 339f0af..49ee428 100644 --- a/lib/controller/mine/my_friend_controller.dart +++ b/lib/controller/mine/my_friend_controller.dart @@ -1,21 +1,66 @@ +import 'package:dating_touchme_app/network/user_api.dart'; +import 'package:easy_refresh/easy_refresh.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; +import '../../model/mine/friend_data.dart'; + class MyFriendController extends GetxController with GetSingleTickerProviderStateMixin { late TabController tabController; final sum = 0.obs; + final page = 1.obs; + final size = 10.obs; + + late UserApi _userApi; + + late final EasyRefreshController listRefreshController; + + final friendList = [].obs; @override void onInit() { super.onInit(); - tabController = TabController(length: 4, vsync: this); + tabController = TabController(length: 3, vsync: this); + + listRefreshController = EasyRefreshController( + controlFinishRefresh: true, + controlFinishLoad: true, + ); + _userApi = Get.find(); + + getFriendList(); } getFriendList() async { + try{ + final response = await _userApi.userPageFriendRelation( + pageNum: page.value, + pageSize: size.value, + ); + if (response.data.isSuccess && response.data.data != null) { + final data = response.data.data?.records ?? []; + + friendList.addAll(data.toList()); + if((data.length ?? 0) == size.value){ + + listRefreshController.finishLoad(IndicatorResult.success); + } else { + listRefreshController.finishLoad(IndicatorResult.noMore); + } + } else { + // 响应失败,抛出异常 + throw Exception(response.data.message ?? '获取数据失败'); + } + } catch(e) { + print('玫瑰记录获取失败: $e'); + SmartDialog.showToast('玫瑰记录获取失败'); + rethrow; + } } } \ No newline at end of file diff --git a/lib/controller/mine/rose_history_controller.dart b/lib/controller/mine/rose_history_controller.dart index 53a29cf..a9074f3 100644 --- a/lib/controller/mine/rose_history_controller.dart +++ b/lib/controller/mine/rose_history_controller.dart @@ -1,6 +1,7 @@ import 'package:dating_touchme_app/model/mine/rose_history_data.dart'; import 'package:dating_touchme_app/network/user_api.dart'; import 'package:easy_refresh/easy_refresh.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; class RoseHistoryController extends GetxController { @@ -61,7 +62,9 @@ class RoseHistoryController extends GetxController { throw Exception(response.data.message ?? '获取数据失败'); } } catch(e) { - + print('玫瑰记录获取失败: $e'); + SmartDialog.showToast('玫瑰记录获取失败'); + rethrow; } } diff --git a/lib/controller/mine/withdraw_history_controller.dart b/lib/controller/mine/withdraw_history_controller.dart index 9799c1e..7866939 100644 --- a/lib/controller/mine/withdraw_history_controller.dart +++ b/lib/controller/mine/withdraw_history_controller.dart @@ -1,5 +1,6 @@ import 'package:dating_touchme_app/network/user_api.dart'; import 'package:easy_refresh/easy_refresh.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:get/get_state_manager/src/simple/get_controllers.dart'; @@ -49,7 +50,9 @@ class WithdrawHistoryController extends GetxController { throw Exception(response.data.message ?? '获取数据失败'); } } catch(e) { - + print('提现记录获取失败: $e'); + SmartDialog.showToast('提现记录获取失败'); + rethrow; } } diff --git a/lib/model/mine/friend_data.dart b/lib/model/mine/friend_data.dart new file mode 100644 index 0000000..b60f392 --- /dev/null +++ b/lib/model/mine/friend_data.dart @@ -0,0 +1,75 @@ +class FriendData { + List? records; + int? total; + int? size; + int? current; + int? pages; + + FriendData({this.records, this.total, this.size, this.current, this.pages}); + + FriendData.fromJson(Map json) { + if (json['records'] != null) { + records = []; + json['records'].forEach((v) { + records!.add(new Records.fromJson(v)); + }); + } + total = json['total']; + size = json['size']; + current = json['current']; + pages = json['pages']; + } + + Map toJson() { + final Map data = new Map(); + if (this.records != null) { + data['records'] = this.records!.map((v) => v.toJson()).toList(); + } + data['total'] = this.total; + data['size'] = this.size; + data['current'] = this.current; + data['pages'] = this.pages; + return data; + } +} + +class Records { + int? genderCode; + String? id; + String? miId; + String? nickName; + String? profilePhoto; + String? uid; + String? userId; + + Records( + {this.genderCode, + this.id, + this.miId, + this.nickName, + this.profilePhoto, + this.uid, + this.userId}); + + Records.fromJson(Map json) { + genderCode = json['genderCode']; + id = json['id']; + miId = json['miId']; + nickName = json['nickName']; + profilePhoto = json['profilePhoto']; + uid = json['uid']; + userId = json['userId']; + } + + Map toJson() { + final Map data = new Map(); + data['genderCode'] = this.genderCode; + data['id'] = this.id; + data['miId'] = this.miId; + data['nickName'] = this.nickName; + data['profilePhoto'] = this.profilePhoto; + data['uid'] = this.uid; + data['userId'] = this.userId; + return data; + } +} diff --git a/lib/network/user_api.dart b/lib/network/user_api.dart index ddac0e4..33c0aae 100644 --- a/lib/network/user_api.dart +++ b/lib/network/user_api.dart @@ -3,6 +3,7 @@ import 'package:dating_touchme_app/model/home/user_info_data.dart'; import 'package:dating_touchme_app/model/mine/bank_card_data.dart'; import 'package:dating_touchme_app/model/mine/bank_card_ocr_data.dart'; import 'package:dating_touchme_app/model/mine/education_data.dart'; +import 'package:dating_touchme_app/model/mine/friend_data.dart'; import 'package:dating_touchme_app/model/mine/login_data.dart'; import 'package:dating_touchme_app/model/mine/occupation_data.dart'; import 'package:dating_touchme_app/model/mine/payment_detail_data.dart'; @@ -206,7 +207,7 @@ abstract class UserApi { @GET(ApiUrls.userPageFriendRelation) - Future>> userPageFriendRelation( + Future>> userPageFriendRelation( { @Query('pageNum') required int pageNum, @Query('pageSize') required int pageSize, diff --git a/lib/network/user_api.g.dart b/lib/network/user_api.g.dart index e371f17..b5de47d 100644 --- a/lib/network/user_api.g.dart +++ b/lib/network/user_api.g.dart @@ -1267,7 +1267,7 @@ class _UserApi implements UserApi { } @override - Future>> userPageFriendRelation({ + Future>> userPageFriendRelation({ required int pageNum, required int pageSize, }) async { @@ -1278,25 +1278,22 @@ class _UserApi implements UserApi { }; final _headers = {}; const Map? _data = null; - final _options = - _setStreamType>>( - Options(method: 'GET', headers: _headers, extra: _extra) - .compose( - _dio.options, - 'dating-agency-chat-audio/user/page/friend-relation', - 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-chat-audio/user/page/friend-relation', + 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) => WithdrawAuditData.fromJson(json as Map), + (json) => FriendData.fromJson(json as Map), ); } on Object catch (e, s) { errorLogger?.logError(e, s, _options); diff --git a/lib/pages/mine/my_friend_page.dart b/lib/pages/mine/my_friend_page.dart index 723b5b9..472f10e 100644 --- a/lib/pages/mine/my_friend_page.dart +++ b/lib/pages/mine/my_friend_page.dart @@ -1,6 +1,9 @@ +import 'package:cached_network_image/cached_network_image.dart'; import 'package:dating_touchme_app/components/page_appbar.dart'; import 'package:dating_touchme_app/controller/mine/my_friend_controller.dart'; import 'package:dating_touchme_app/generated/assets.dart'; +import 'package:dating_touchme_app/model/mine/friend_data.dart'; +import 'package:easy_refresh/easy_refresh.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -15,112 +18,140 @@ class MyFriendPage extends StatelessWidget { init: MyFriendController(), builder: (controller){ return Scaffold( - appBar: PageAppbar(title: "我的关注${controller.sum.value}"), - body: SingleChildScrollView( - child: Container( - padding: EdgeInsets.all(22.w), - child: Column( - children: [ - TDTabBar( - tabs: [ - TDTab( - child: Padding( - padding: EdgeInsets.only(right: 16, left: 16), - child: Text('全部'), + appBar: PageAppbar(title: "我的关注"), + body: EasyRefresh( + controller: controller.listRefreshController, + header: const ClassicHeader( + dragText: '下拉刷新', + armedText: '释放刷新', + readyText: '刷新中...', + processingText: '刷新中...', + processedText: '刷新完成', + failedText: '刷新失败', + noMoreText: '没有更多数据', + showMessage: false + ), + footer: ClassicFooter( + dragText: '上拉加载', + armedText: '释放加载', + readyText: '加载中...', + processingText: '加载中...', + processedText: '加载完成', + failedText: '加载失败', + noMoreText: '没有更多数据', + showMessage: false + ), + // 下拉刷新 + onRefresh: () async { + print('推荐列表下拉刷新被触发'); + controller.page.value = 1; + controller.friendList.clear(); + await controller.getFriendList(); + controller.listRefreshController.finishRefresh(IndicatorResult.success); + controller.listRefreshController.finishLoad(IndicatorResult.none); + }, + // 上拉加载更多 + onLoad: () async { + print('推荐列表上拉加载被触发, hasMore: '); + controller.page.value += 1; + controller.getFriendList(); + }, + child: SingleChildScrollView( + child: Container( + padding: EdgeInsets.symmetric(horizontal: 12.w), + child: Column( + children: [ + TDTabBar( + tabs: [ + TDTab( + child: Padding( + padding: EdgeInsets.only(right: 16, left: 16), + child: Text('我的关注'), + ), ), - ), - TDTab( - child: Padding( - padding: EdgeInsets.only(right: 16, left: 16), - child: Text('同城'), + TDTab( + child: Padding( + padding: EdgeInsets.only(right: 16, left: 16), + child: Text('好友'), + ), ), - ), - TDTab( - child: Padding( - padding: EdgeInsets.only(right: 12, left: 12), - child: Text('相亲视频'), + TDTab( + child: Padding( + padding: EdgeInsets.only(right: 12, left: 12), + child: Text('粉丝'), + ), ), - ), - TDTab( - child: Padding( - padding: EdgeInsets.only(right: 12, left: 12), - child: Text('相亲语音'), + ], + backgroundColor: Colors.transparent, + labelPadding: const EdgeInsets.only(right: 4, top: 10, bottom: 10, left: 4), + selectedBgColor: const Color.fromRGBO(108, 105, 244, 1), + unSelectedBgColor: Colors.transparent, + labelColor: Colors.white, + dividerHeight: 0, + tabAlignment: TabAlignment.start, + outlineType: TDTabBarOutlineType.capsule, + controller: controller.tabController, + showIndicator: false, + isScrollable: true, + onTap: (index) { + print('相亲页面 Tab: $index'); + }, + ), + if(controller.friendList.isEmpty) ...[ + Container( + padding: EdgeInsets.only(top: 60.w,bottom: 13.w), + child: Center( + child: Image.asset( + Assets.imagesEmptyIcon, + width: 91.w, + height: 91.w, + ), ), ), - ], - backgroundColor: Colors.transparent, - labelPadding: const EdgeInsets.only(right: 4, top: 10, bottom: 10, left: 4), - selectedBgColor: const Color.fromRGBO(108, 105, 244, 1), - unSelectedBgColor: Colors.transparent, - labelColor: Colors.white, - dividerHeight: 0, - tabAlignment: TabAlignment.start, - outlineType: TDTabBarOutlineType.capsule, - controller: controller.tabController, - showIndicator: false, - isScrollable: true, - onTap: (index) { - print('相亲页面 Tab: $index'); - }, - ), - if(false) ...[ - Container( - padding: EdgeInsets.only(top: 60.w,bottom: 13.w), - child: Center( - child: Image.asset( - Assets.imagesEmptyIcon, - width: 91.w, - height: 91.w, + Text( + "你还没有关注任何人噢", + style: TextStyle( + fontSize: 12.w, + fontWeight: FontWeight.w500, + color: const Color.fromRGBO(144, 144, 144, 1) ), ), - ), - Text( - "你还没有关注任何人噢", - style: TextStyle( - fontSize: 12.w, - fontWeight: FontWeight.w500, - color: const Color.fromRGBO(144, 144, 144, 1) - ), - ), - Container( - width: 151.w, - height: 32.w, - margin: EdgeInsets.only(top: 11.w), - decoration: BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(32.w)), - gradient: LinearGradient( - begin: Alignment.centerLeft, - end: Alignment.centerRight, - stops: [0.0, 0.7753, 1.0], - colors: [ - Color.fromRGBO(131, 89, 255, 1), - Color.fromRGBO(77, 127, 231, 1), - Color.fromRGBO(61, 138, 224, 1), - ], + Container( + width: 151.w, + height: 32.w, + margin: EdgeInsets.only(top: 11.w), + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(32.w)), + gradient: LinearGradient( + begin: Alignment.centerLeft, + end: Alignment.centerRight, + stops: [0.0, 0.7753, 1.0], + colors: [ + Color.fromRGBO(131, 89, 255, 1), + Color.fromRGBO(77, 127, 231, 1), + Color.fromRGBO(61, 138, 224, 1), + ], + ), ), - ), - child: Center( - child: Text( - "去聊聊", - style: TextStyle( - fontSize: 12.w, - color: Colors.white, - fontWeight: FontWeight.w500 + child: Center( + child: Text( + "去聊聊", + style: TextStyle( + fontSize: 12.w, + color: Colors.white, + fontWeight: FontWeight.w500 + ), ), ), ), - ), + ], + if(controller.friendList.isNotEmpty) ...[ + ...controller.friendList.map((e){ + return UserItem(item: e,); + }) + ] ], - ...[ - UserItem(), - UserItem(), - UserItem(), - UserItem(), - UserItem(), - UserItem(), - UserItem(), - ] - ], + ), ), ), ), @@ -131,7 +162,8 @@ class MyFriendPage extends StatelessWidget { } class UserItem extends StatefulWidget { - const UserItem({super.key}); + final Records item; + const UserItem({super.key, required this.item}); @override State createState() => _UserItemState(); @@ -151,10 +183,11 @@ class _UserItemState extends State { children: [ ClipRRect( borderRadius: BorderRadius.all(Radius.circular(45.w)), - child: Image.asset( - Assets.imagesUserAvatar, + child: CachedNetworkImage( + imageUrl: "${widget.item.profilePhoto ?? ""}?x-oss-process=image/format,webp/resize,w_170", width: 45.w, height: 45.w, + fit: BoxFit.cover, ), ), SizedBox(width: 9.w,), @@ -164,7 +197,7 @@ class _UserItemState extends State { Row( children: [ Text( - "叫我大王", + "${widget.item.nickName}", style: TextStyle( fontSize: 14.w, fontWeight: FontWeight.w500 @@ -176,11 +209,11 @@ class _UserItemState extends State { height: 12.w, decoration: BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(12.w)), - color: const Color.fromRGBO(255, 237, 255, 1) + color: widget.item.genderCode == 0 ? const Color.fromRGBO(237, 245, 255, 1) : const Color.fromRGBO(255, 237, 255, 1) ), child: Center( child: Image.asset( - Assets.imagesFemale, + widget.item.genderCode == 0 ? Assets.imagesMale : Assets.imagesFemale, width: 7.w, ), ),