From 7c43765b66a314cc938db88385bedf1196222bdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=AD=90=E8=B4=A4?= Date: Tue, 9 Dec 2025 15:07:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E6=8E=A5=E5=A5=BD=E5=8F=8B=E5=88=97?= =?UTF-8?q?=E8=A1=A8=EF=BC=8C=E7=94=B3=E8=AF=B7=E5=88=97=E8=A1=A8=EF=BC=8C?= =?UTF-8?q?=E7=A1=AE=E8=AE=A4=E7=94=B3=E8=AF=B7=EF=BC=8C=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E9=81=93=E5=85=B7=E6=8E=A5=E5=8F=A3=EF=BC=8C=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E4=B8=AD=E5=BF=83=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/images/mic_coupon_icon.png | Bin 0 -> 46827 bytes lib/controller/mine/mine_controller.dart | 27 --- lib/controller/mine/my_friend_controller.dart | 6 +- .../mine/rose_history_controller.dart | 38 +++- lib/generated/assets.dart | 2 + lib/model/mine/friend_apply_data.dart | 30 ++- lib/model/mine/friend_data.dart | 50 +++-- lib/model/mine/user_prop_data.dart | 83 ++++++++ lib/network/api_urls.dart | 2 + lib/network/user_api.dart | 7 + lib/network/user_api.g.dart | 37 ++++ lib/pages/mine/mine_page.dart | 182 ++++++++++++------ lib/pages/mine/my_friend_page.dart | 12 +- lib/pages/mine/rose_history_page.dart | 50 +++-- 14 files changed, 393 insertions(+), 133 deletions(-) create mode 100644 assets/images/mic_coupon_icon.png create mode 100644 lib/model/mine/user_prop_data.dart diff --git a/assets/images/mic_coupon_icon.png b/assets/images/mic_coupon_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..488819ff7136607abcf3df3a70367a00f25cc121 GIT binary patch literal 46827 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 literal 0 HcmV?d00001 diff --git a/lib/controller/mine/mine_controller.dart b/lib/controller/mine/mine_controller.dart index f29b4fe..95d2982 100644 --- a/lib/controller/mine/mine_controller.dart +++ b/lib/controller/mine/mine_controller.dart @@ -16,11 +16,6 @@ import '../../pages/setting/setting_page.dart'; class MineController extends GetxController { - final infoList = [ - {"label": "好友", "num": 0, "type": 1}, - {"label": "好友申请", "num": 0, "type": 2}, - {"label": "访客", "num": 0, "type": 3}, - ].obs; final blockList = [ {"icon": Assets.imagesRose, "title": "我的玫瑰", "subTitle": "新人限时福利", "path": () => RosePage()}, @@ -49,28 +44,6 @@ class MineController extends GetxController { userData.value = GlobalData().userData; userId.value = GlobalData().userId; _userApi = Get.find(); - getUserCount(); - } - - getUserCount() async { - try { - final response = await _userApi.userGetDongwoOwnUserCount(); - if (response.data.isSuccess && response.data.data != null) { - countData.value = response.data.data ?? UserCountData(friendNum: 0, friendApplyNum: 0, visitorNum:0); - infoList[0]["num"] = countData.value.friendNum; - infoList[1]["num"] = countData.value.friendApplyNum; - infoList[2]["num"] = countData.value.visitorNum; - } 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/my_friend_controller.dart b/lib/controller/mine/my_friend_controller.dart index 3de52ca..6075d1d 100644 --- a/lib/controller/mine/my_friend_controller.dart +++ b/lib/controller/mine/my_friend_controller.dart @@ -106,8 +106,12 @@ class MyFriendController extends GetxController with GetSingleTickerProviderStat "status": status }); if (response.data.isSuccess) { - SmartDialog.showToast(response.data.message); item.status = status; + if(status == 2){ + SmartDialog.showToast('添加成功'); + } else if(status == 3){ + SmartDialog.showToast('拒绝成功'); + } } else { // 响应失败,抛出异常 diff --git a/lib/controller/mine/rose_history_controller.dart b/lib/controller/mine/rose_history_controller.dart index a9074f3..044bf56 100644 --- a/lib/controller/mine/rose_history_controller.dart +++ b/lib/controller/mine/rose_history_controller.dart @@ -3,6 +3,7 @@ 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:dating_touchme_app/model/mine/user_prop_data.dart' as up; class RoseHistoryController extends GetxController { @@ -14,6 +15,8 @@ class RoseHistoryController extends GetxController { final roseHistoryList = [].obs; + final propList = [].obs; + final page = 1.obs; final size = 10.obs; @@ -34,9 +37,42 @@ class RoseHistoryController extends GetxController { changeNavTab(int i) async { roseHistoryList.clear(); + propList.clear(); friendNavActive.value = i; page.value = 1; - getHistoryList(); + if(i != 2){ + getHistoryList(); + } else { + getPropList(); + } + } + + getPropList() async { + try{ + final response = await _userApi.userPageUserProp( + pageNum: page.value, + pageSize: size.value, + ); + if (response.data.isSuccess && response.data.data != null) { + final data = response.data.data?.records ?? []; + + propList.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; + } } getHistoryList() async { diff --git a/lib/generated/assets.dart b/lib/generated/assets.dart index b9f8919..05faea3 100644 --- a/lib/generated/assets.dart +++ b/lib/generated/assets.dart @@ -70,6 +70,7 @@ class Assets { static const String imagesAd = 'assets/images/ad.png'; static const String imagesAdd = 'assets/images/add.png'; static const String imagesAliPay = 'assets/images/ali_pay.png'; + static const String imagesAppLogo = 'assets/images/app_logo.jpg'; static const String imagesArrow = 'assets/images/arrow.png'; static const String imagesArrowForwardRight = 'assets/images/arrow_forward_right.png'; static const String imagesArrowR = 'assets/images/arrow_r.png'; @@ -137,6 +138,7 @@ class Assets { static const String imagesMessageNol = 'assets/images/message_nol.png'; static const String imagesMessagePre = 'assets/images/message_pre.png'; static const String imagesMicClose = 'assets/images/mic_close.png'; + static const String imagesMicCouponIcon = 'assets/images/mic_coupon_icon.png'; static const String imagesMicLine = 'assets/images/mic_line.png'; static const String imagesMicOff = 'assets/images/mic_off.png'; static const String imagesMicOpen = 'assets/images/mic_open.png'; diff --git a/lib/model/mine/friend_apply_data.dart b/lib/model/mine/friend_apply_data.dart index 7352b6e..535dfb9 100644 --- a/lib/model/mine/friend_apply_data.dart +++ b/lib/model/mine/friend_apply_data.dart @@ -44,6 +44,13 @@ class Records { int? toGenderCode; Null? applyMsg; int? status; + String? birthYear; + String? birthDate; + int? age; + int? provinceCode; + String? provinceName; + int? cityCode; + String? cityName; Records( {this.id, @@ -54,7 +61,14 @@ class Records { this.toProfilePhoto, this.toGenderCode, this.applyMsg, - this.status}); + this.status, + this.birthYear, + this.birthDate, + this.age, + this.provinceCode, + this.provinceName, + this.cityCode, + this.cityName}); Records.fromJson(Map json) { id = json['id']; @@ -66,6 +80,13 @@ class Records { toGenderCode = json['toGenderCode']; applyMsg = json['applyMsg']; status = json['status']; + birthYear = json['birthYear']; + birthDate = json['birthDate']; + age = json['age']; + provinceCode = json['provinceCode']; + provinceName = json['provinceName']; + cityCode = json['cityCode']; + cityName = json['cityName']; } Map toJson() { @@ -79,6 +100,13 @@ class Records { data['toGenderCode'] = this.toGenderCode; data['applyMsg'] = this.applyMsg; data['status'] = this.status; + data['birthYear'] = this.birthYear; + data['birthDate'] = this.birthDate; + data['age'] = this.age; + data['provinceCode'] = this.provinceCode; + data['provinceName'] = this.provinceName; + data['cityCode'] = this.cityCode; + data['cityName'] = this.cityName; return data; } } diff --git a/lib/model/mine/friend_data.dart b/lib/model/mine/friend_data.dart index b60f392..247b254 100644 --- a/lib/model/mine/friend_data.dart +++ b/lib/model/mine/friend_data.dart @@ -34,42 +34,70 @@ class FriendData { } class Records { - int? genderCode; String? id; + String? userId; String? miId; String? nickName; String? profilePhoto; - String? uid; - String? userId; + int? genderCode; + String? birthYear; + String? birthDate; + int? age; + int? provinceCode; + String? provinceName; + int? cityCode; + String? cityName; + int? uid; Records( - {this.genderCode, - this.id, + {this.id, + this.userId, this.miId, this.nickName, this.profilePhoto, - this.uid, - this.userId}); + this.genderCode, + this.birthYear, + this.birthDate, + this.age, + this.provinceCode, + this.provinceName, + this.cityCode, + this.cityName, + this.uid}); Records.fromJson(Map json) { - genderCode = json['genderCode']; id = json['id']; + userId = json['userId']; miId = json['miId']; nickName = json['nickName']; profilePhoto = json['profilePhoto']; + genderCode = json['genderCode']; + birthYear = json['birthYear']; + birthDate = json['birthDate']; + age = json['age']; + provinceCode = json['provinceCode']; + provinceName = json['provinceName']; + cityCode = json['cityCode']; + cityName = json['cityName']; uid = json['uid']; - userId = json['userId']; } Map toJson() { final Map data = new Map(); - data['genderCode'] = this.genderCode; data['id'] = this.id; + data['userId'] = this.userId; data['miId'] = this.miId; data['nickName'] = this.nickName; data['profilePhoto'] = this.profilePhoto; + data['genderCode'] = this.genderCode; + data['birthYear'] = this.birthYear; + data['birthDate'] = this.birthDate; + data['age'] = this.age; + data['provinceCode'] = this.provinceCode; + data['provinceName'] = this.provinceName; + data['cityCode'] = this.cityCode; + data['cityName'] = this.cityName; data['uid'] = this.uid; - data['userId'] = this.userId; return data; } } diff --git a/lib/model/mine/user_prop_data.dart b/lib/model/mine/user_prop_data.dart new file mode 100644 index 0000000..9557960 --- /dev/null +++ b/lib/model/mine/user_prop_data.dart @@ -0,0 +1,83 @@ +class UserPropData { + int? current; + int? pages; + List? records; + int? size; + int? total; + + UserPropData({this.current, this.pages, this.records, this.size, this.total}); + + UserPropData.fromJson(Map json) { + current = json['current']; + pages = json['pages']; + if (json['records'] != null) { + records = []; + json['records'].forEach((v) { + records!.add(new Records.fromJson(v)); + }); + } + size = json['size']; + total = json['total']; + } + + Map toJson() { + final Map data = new Map(); + data['current'] = this.current; + data['pages'] = this.pages; + if (this.records != null) { + data['records'] = this.records!.map((v) => v.toJson()).toList(); + } + data['size'] = this.size; + data['total'] = this.total; + return data; + } +} + +class Records { + bool? enable; + String? endTime; + int? id; + String? logoUrl; + String? name; + int? num; + String? startTime; + int? type; + int? userId; + + Records( + {this.enable, + this.endTime, + this.id, + this.logoUrl, + this.name, + this.num, + this.startTime, + this.type, + this.userId}); + + Records.fromJson(Map json) { + enable = json['enable']; + endTime = json['endTime']; + id = json['id']; + logoUrl = json['logoUrl']; + name = json['name']; + num = json['num']; + startTime = json['startTime']; + type = json['type']; + userId = json['userId']; + } + + Map toJson() { + final Map data = new Map(); + data['enable'] = this.enable; + data['endTime'] = this.endTime; + data['id'] = this.id; + data['logoUrl'] = this.logoUrl; + data['name'] = this.name; + data['num'] = this.num; + data['startTime'] = this.startTime; + data['type'] = this.type; + data['userId'] = this.userId; + return data; + } +} diff --git a/lib/network/api_urls.dart b/lib/network/api_urls.dart index 9e55a17..06241e9 100644 --- a/lib/network/api_urls.dart +++ b/lib/network/api_urls.dart @@ -96,6 +96,8 @@ class ApiUrls { 'dating-agency-chat-audio/user/page/friend-apply'; static const String userConfirmFriendApply = 'dating-agency-chat-audio/user/confirm/friend-apply'; + static const String userPageUserProp = + 'dating-agency-chat-audio/user/page/user-prop'; //首页相关接口 static const String getMarriageList = diff --git a/lib/network/user_api.dart b/lib/network/user_api.dart index 91410d2..e641780 100644 --- a/lib/network/user_api.dart +++ b/lib/network/user_api.dart @@ -13,6 +13,7 @@ import 'package:dating_touchme_app/model/mine/rose_history_data.dart'; import 'package:dating_touchme_app/model/mine/user_base_data.dart'; import 'package:dating_touchme_app/model/mine/user_count_data.dart'; import 'package:dating_touchme_app/model/mine/user_data.dart'; +import 'package:dating_touchme_app/model/mine/user_prop_data.dart'; import 'package:dating_touchme_app/model/mine/user_rose_data.dart'; import 'package:dating_touchme_app/model/mine/wallet_account_data.dart'; import 'package:dating_touchme_app/model/mine/wallet_account_record_data.dart'; @@ -249,4 +250,10 @@ abstract class UserApi { Future>> userConfirmFriendApply( @Body() Map data, ); + + @GET(ApiUrls.userPageUserProp) + Future>> userPageUserProp({ + @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 b5f7c71..05d71b0 100644 --- a/lib/network/user_api.g.dart +++ b/lib/network/user_api.g.dart @@ -1523,6 +1523,43 @@ class _UserApi implements UserApi { return httpResponse; } + @override + Future>> userPageUserProp({ + required int pageNum, + required int pageSize, + }) async { + final _extra = {}; + final queryParameters = { + r'pageNum': pageNum, + r'pageSize': pageSize, + }; + 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/user-prop', + queryParameters: queryParameters, + data: _data, + ) + .copyWith(baseUrl: _combineBaseUrls(_dio.options.baseUrl, baseUrl)), + ); + final _result = await _dio.fetch>(_options); + late BaseResponse _value; + try { + _value = BaseResponse.fromJson( + _result.data!, + (json) => UserPropData.fromJson(json as Map), + ); + } on Object catch (e, s) { + errorLogger?.logError(e, s, _options); + rethrow; + } + final httpResponse = HttpResponse(_value, _result); + return httpResponse; + } + RequestOptions _setStreamType(RequestOptions requestOptions) { if (T != dynamic && !(requestOptions.responseType == ResponseType.bytes || diff --git a/lib/pages/mine/mine_page.dart b/lib/pages/mine/mine_page.dart index 2329efb..0b49ea3 100644 --- a/lib/pages/mine/mine_page.dart +++ b/lib/pages/mine/mine_page.dart @@ -2,6 +2,8 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:dating_touchme_app/controller/global.dart'; import 'package:dating_touchme_app/controller/mine/mine_controller.dart'; import 'package:dating_touchme_app/extension/ex_widget.dart'; +import 'package:dating_touchme_app/model/mine/user_count_data.dart'; +import 'package:dating_touchme_app/network/user_api.dart'; import 'package:dating_touchme_app/pages/mine/edit_info_page.dart'; import 'package:dating_touchme_app/pages/mine/my_friend_page.dart'; import 'package:dating_touchme_app/pages/mine/vip_page.dart'; @@ -23,6 +25,17 @@ class MinePage extends StatefulWidget { class _MinePageState extends State with AutomaticKeepAliveClientMixin{ + late MineController controller; + + final countData = UserCountData(friendNum: 0, friendApplyNum: 0, visitorNum:0).obs; + late UserApi _userApi; + + final infoList = [ + {"label": "好友", "num": 0, "type": 1}, + {"label": "好友申请", "num": 0, "type": 2}, + {"label": "访客", "num": 0, "type": 3}, + ].obs; + @override void initState() { @@ -30,19 +43,50 @@ class _MinePageState extends State with AutomaticKeepAliveClientMixin{ // 确保 HomeController 已注册 if (!Get.isRegistered()) { - Get.put(MineController()); + controller = Get.put(MineController()); + } else { + controller = Get.find(); } + _userApi = Get.find(); + getUserCount(); } + getUserCount() async { + try { + final response = await _userApi.userGetDongwoOwnUserCount(); + if (response.data.isSuccess && response.data.data != null) { + countData.value = response.data.data ?? UserCountData(friendNum: 0, friendApplyNum: 0, visitorNum:0); + infoList.value = [ + {"label": "好友", "num": countData.value.friendNum, "type": 1}, + {"label": "好友申请", "num": countData.value.friendApplyNum, "type": 2}, + {"label": "访客", "num": countData.value.visitorNum, "type": 3}, + ]; + setState(() { + + }); + } else { + + // 响应失败,抛出异常 + throw Exception(response.data.message ?? '获取数据失败'); + } + } catch(e){ + print('用户数据获取失败: $e'); + SmartDialog.showToast('用户数据获取失败'); + rethrow; + + } + } + @override Widget build(BuildContext context) { super.build(context); - return GetBuilder( + return GetX( init: MineController(), builder: (controller) { + controller.userData.value = GlobalData().userData; controller.userId.value = GlobalData().userId; return Container( @@ -76,24 +120,24 @@ class _MinePageState extends State with AutomaticKeepAliveClientMixin{ Row( children: [ ClipRRect( - borderRadius: BorderRadius.all(Radius.circular(60.w)), - child: (controller.userData.value?.profilePhoto?.isNotEmpty ?? false) ? CachedNetworkImage( - imageUrl: "${controller.userData.value?.profilePhoto ?? ""}?x-oss-process=image/format,webp/resize,w_120", - width: 60.w, - height: 60.w, - imageBuilder: (context, imageProvider) => Container( - decoration: BoxDecoration( - image: DecorationImage( - image: imageProvider, - fit: BoxFit.cover, + borderRadius: BorderRadius.all(Radius.circular(60.w)), + child: (controller.userData.value?.profilePhoto?.isNotEmpty ?? false) ? CachedNetworkImage( + imageUrl: "${controller.userData.value?.profilePhoto ?? ""}?x-oss-process=image/format,webp/resize,w_120", + width: 60.w, + height: 60.w, + imageBuilder: (context, imageProvider) => Container( + decoration: BoxDecoration( + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, + ), ), ), - ), - ) : Image.asset( - Assets.imagesUserAvatar, - width: 60.w, - height: 60.w, - ) + ) : Image.asset( + Assets.imagesUserAvatar, + width: 60.w, + height: 60.w, + ) ), SizedBox(width: 14.w,), Column( @@ -194,8 +238,8 @@ class _MinePageState extends State with AutomaticKeepAliveClientMixin{ child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - ...controller.infoList.map((e){ - return InfoItem(item: e); + ...infoList.map((e){ + return InfoItem(item: e, getUserCount: getUserCount,); }), ], ), @@ -257,7 +301,8 @@ class _MinePageState extends State with AutomaticKeepAliveClientMixin{ class InfoItem extends StatefulWidget { final Map item; - const InfoItem({super.key, required this.item}); + final Function getUserCount; + const InfoItem({super.key, required this.item, required this.getUserCount}); @override State createState() => _InfoItemState(); @@ -266,48 +311,63 @@ class InfoItem extends StatefulWidget { class _InfoItemState extends State { @override Widget build(BuildContext context) { - return Column( - children: [ - Stack( - clipBehavior: Clip.none, - children: [ - Text( - "${widget.item["num"]}", - style: TextStyle( - fontSize: 15.w, - color: Colors.black, - fontWeight: FontWeight.w700 - ), - ), - if(widget.item["type"] == 2 && widget.item["num"] != 0)Positioned( - right: -5.w, - top: 0, - child: Container( - width: 5.w, - height: 5.w, - decoration: BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(5.w)), - color: const Color.fromRGBO(255, 87, 51, 1) + return Expanded( + child: Container( + alignment: widget.item["type"] == 1 ? Alignment.centerLeft : widget.item["type"] == 2 ? Alignment.center : Alignment.centerRight, + child: Column( + children: [ + Stack( + clipBehavior: Clip.none, + children: [ + Text( + "${widget.item["num"]}", + style: TextStyle( + fontSize: 15.w, + color: Colors.black, + fontWeight: FontWeight.w700 + ), + ), + if(widget.item["type"] == 2 && widget.item["num"] != 0)Positioned( + right: -5.w, + top: 0, + child: Container( + width: 5.w, + height: 5.w, + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(5.w)), + color: const Color.fromRGBO(255, 87, 51, 1) + ), + ), + ) + ], ), - ), + Text( + widget.item["label"], + style: TextStyle( + fontSize: 10.w, + color: const Color.fromRGBO(166, 166, 166, 1), + ), + ) + ], ) - ], - ), - Text( - widget.item["label"], - style: TextStyle( - fontSize: 10.w, - color: const Color.fromRGBO(166, 166, 166, 1), - ), - ) - ], - ).onTap((){ - if(widget.item['type'] == 3){ - Get.to(()=> VisitorListPage()); - } else { - Get.to(()=> MyFriendPage()); - } - }); + ).onTap((){ + if(widget.item['type'] == 3){ + Get.to(()=> VisitorListPage())?.then((w) async { + await widget.getUserCount(); + setState(() { + + }); + }); + } else { + Get.to(()=> MyFriendPage())?.then((w) async { + await widget.getUserCount(); + setState(() { + + }); + }); + } + }) + ); } } diff --git a/lib/pages/mine/my_friend_page.dart b/lib/pages/mine/my_friend_page.dart index cedd4eb..4c3c087 100644 --- a/lib/pages/mine/my_friend_page.dart +++ b/lib/pages/mine/my_friend_page.dart @@ -20,7 +20,7 @@ class MyFriendPage extends StatelessWidget { init: MyFriendController(), builder: (controller){ return Scaffold( - appBar: PageAppbar(title: "我的关注"), + appBar: PageAppbar(title: "我的好友"), body: EasyRefresh( controller: controller.listRefreshController, header: const ClassicHeader( @@ -252,7 +252,7 @@ class _UserItemState extends State { ], ), Text( - "30岁·广州", + "${widget.item.age}岁·${widget.item.cityName}", style: TextStyle( fontSize: 11.w, color: const Color.fromRGBO(144, 144, 144, 1), @@ -348,7 +348,7 @@ class _AddUserItemState extends State { ], ), Text( - "30岁·广州", + "${widget.item.age}岁·${widget.item.cityName}", style: TextStyle( fontSize: 11.w, color: const Color.fromRGBO(144, 144, 144, 1), @@ -427,6 +427,9 @@ class _AddUserItemState extends State { onPressed: () async { await widget.controller.applyFriend(widget.item.id ?? "", 2, widget.item); Navigator.of(context).pop(); + setState(() { + + }); }, ), // 通常是按钮 @@ -435,6 +438,9 @@ class _AddUserItemState extends State { onPressed: () async { await widget.controller.applyFriend(widget.item.id ?? "", 3, widget.item); Navigator.of(context).pop(); + setState(() { + + }); }, ), ], diff --git a/lib/pages/mine/rose_history_page.dart b/lib/pages/mine/rose_history_page.dart index b55b3cc..3c83dcd 100644 --- a/lib/pages/mine/rose_history_page.dart +++ b/lib/pages/mine/rose_history_page.dart @@ -6,6 +6,7 @@ import 'package:easy_refresh/easy_refresh.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:dating_touchme_app/model/mine/user_prop_data.dart' as up; class RoseHistoryPage extends StatelessWidget { @@ -46,7 +47,12 @@ class RoseHistoryPage extends StatelessWidget { print('推荐列表下拉刷新被触发'); controller.page.value = 1; controller.roseHistoryList.clear(); - await controller.getHistoryList(); + controller.propList.clear(); + if(controller.friendNavActive.value != 2){ + await controller.getHistoryList(); + } else { + await controller.getPropList(); + } controller.listRefreshController.finishRefresh(IndicatorResult.success); controller.listRefreshController.finishLoad(IndicatorResult.none); }, @@ -54,7 +60,11 @@ class RoseHistoryPage extends StatelessWidget { onLoad: () async { print('推荐列表上拉加载被触发, hasMore: '); controller.page.value += 1; - controller.getHistoryList(); + if(controller.friendNavActive.value != 2){ + controller.getHistoryList(); + } else { + controller.getPropList(); + } }, child: SingleChildScrollView( child: Container( @@ -106,26 +116,9 @@ class RoseHistoryPage extends StatelessWidget { }) ], if(controller.friendNavActive.value == 2) ...[ - ChatCouponItem(), - ChatCouponItem(), - ChatCouponItem(), - ChatCouponItem(), - ChatCouponItem(), - ChatCouponItem(), - ChatCouponItem(), - ChatCouponItem(), - ChatCouponItem(), - ChatCouponItem(), - ChatCouponItem(), - ChatCouponItem(), - ChatCouponItem(), - ChatCouponItem(), - ChatCouponItem(), - ChatCouponItem(), - ChatCouponItem(), - ChatCouponItem(), - ChatCouponItem(), - ChatCouponItem(), + ...controller.propList.map((e) { + return ChatCouponItem(item: e,); + }) ], ], ), @@ -221,7 +214,8 @@ class _SendItemState extends State { } class ChatCouponItem extends StatefulWidget { - const ChatCouponItem({super.key}); + final up.Records item; + const ChatCouponItem({super.key, required this.item}); @override State createState() => _ChatCouponItemState(); @@ -238,7 +232,7 @@ class _ChatCouponItemState extends State { Row( children: [ Image.asset( - Assets.imagesChatCouponIcon, + widget.item.type == 1 ? Assets.imagesChatCouponIcon : Assets.imagesMicCouponIcon, width: 40.w, height: 40.w , ), @@ -248,14 +242,14 @@ class _ChatCouponItemState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - "视频详情直播间送礼物", + widget.item.type == 1 ? "主动发起聊天" : "主动发起连麦", style: TextStyle( fontSize: 13.w, fontWeight: FontWeight.w500 ), ), Text( - "2025-11-03 17:55:55", + "${widget.item.startTime}", style: TextStyle( fontSize: 11.w, color: const Color.fromRGBO(144, 144, 144, 1) @@ -270,14 +264,14 @@ class _ChatCouponItemState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - "主动发消息", + widget.item.type == 1 ? "主动发起聊天" : "主动发起连麦", style: TextStyle( fontSize: 13.w, color: const Color.fromRGBO(144, 144, 144, 1) ), ), Text( - "-1张", + "-${widget.item.num}张", style: TextStyle( fontSize: 13.w, color: const Color.fromRGBO(227, 84, 84, 1)