Browse Source

对接好友列表接口,优化好友列表排版

ios
王子贤 3 months ago
parent
commit
69c3946a27
7 changed files with 278 additions and 121 deletions
  1. 47
      lib/controller/mine/my_friend_controller.dart
  2. 5
      lib/controller/mine/rose_history_controller.dart
  3. 5
      lib/controller/mine/withdraw_history_controller.dart
  4. 75
      lib/model/mine/friend_data.dart
  5. 3
      lib/network/user_api.dart
  6. 31
      lib/network/user_api.g.dart
  7. 233
      lib/pages/mine/my_friend_page.dart

47
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 = <Records>[].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<UserApi>();
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;
}
}
}

5
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;
}
}

5
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;
}
}

75
lib/model/mine/friend_data.dart

@ -0,0 +1,75 @@
class FriendData {
List<Records>? records;
int? total;
int? size;
int? current;
int? pages;
FriendData({this.records, this.total, this.size, this.current, this.pages});
FriendData.fromJson(Map<String, dynamic> json) {
if (json['records'] != null) {
records = <Records>[];
json['records'].forEach((v) {
records!.add(new Records.fromJson(v));
});
}
total = json['total'];
size = json['size'];
current = json['current'];
pages = json['pages'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
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<String, dynamic> json) {
genderCode = json['genderCode'];
id = json['id'];
miId = json['miId'];
nickName = json['nickName'];
profilePhoto = json['profilePhoto'];
uid = json['uid'];
userId = json['userId'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
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;
}
}

3
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<HttpResponse<BaseResponse<WithdrawAuditData>>> userPageFriendRelation(
Future<HttpResponse<BaseResponse<FriendData>>> userPageFriendRelation(
{
@Query('pageNum') required int pageNum,
@Query('pageSize') required int pageSize,

31
lib/network/user_api.g.dart

@ -1267,7 +1267,7 @@ class _UserApi implements UserApi {
}
@override
Future<HttpResponse<BaseResponse<WithdrawAuditData>>> userPageFriendRelation({
Future<HttpResponse<BaseResponse<FriendData>>> userPageFriendRelation({
required int pageNum,
required int pageSize,
}) async {
@ -1278,25 +1278,22 @@ class _UserApi implements UserApi {
};
final _headers = <String, dynamic>{};
const Map<String, dynamic>? _data = null;
final _options =
_setStreamType<HttpResponse<BaseResponse<WithdrawAuditData>>>(
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<HttpResponse<BaseResponse<FriendData>>>(
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<Map<String, dynamic>>(_options);
late BaseResponse<WithdrawAuditData> _value;
late BaseResponse<FriendData> _value;
try {
_value = BaseResponse<WithdrawAuditData>.fromJson(
_value = BaseResponse<FriendData>.fromJson(
_result.data!,
(json) => WithdrawAuditData.fromJson(json as Map<String, dynamic>),
(json) => FriendData.fromJson(json as Map<String, dynamic>),
);
} on Object catch (e, s) {
errorLogger?.logError(e, s, _options);

233
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<UserItem> createState() => _UserItemState();
@ -151,10 +183,11 @@ class _UserItemState extends State<UserItem> {
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<UserItem> {
Row(
children: [
Text(
"叫我大王",
"${widget.item.nickName}",
style: TextStyle(
fontSize: 14.w,
fontWeight: FontWeight.w500
@ -176,11 +209,11 @@ class _UserItemState extends State<UserItem> {
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,
),
),

Loading…
Cancel
Save