diff --git a/lib/controller/discover/visitor_controller.dart b/lib/controller/discover/visitor_controller.dart index d2eca07..8ff3a63 100644 --- a/lib/controller/discover/visitor_controller.dart +++ b/lib/controller/discover/visitor_controller.dart @@ -9,7 +9,7 @@ class VisitorController extends GetxController { // Refresh controllers final RefreshController refreshController = RefreshController(); - final RefreshController loadMoreController = RefreshController(); + // final RefreshController loadMoreController = RefreshController(); // 分页参数 var currentPage = 1.obs; @@ -53,12 +53,14 @@ class VisitorController extends GetxController { } else { refreshController.loadComplete(); } + print(56); } // 上拉加载更多 void onLoadMore() async { + print('onLoadMore'); if (!hasMore.value) { - loadMoreController.loadNoData(); + refreshController.loadNoData(); return; } @@ -70,11 +72,11 @@ class VisitorController extends GetxController { if (newVisitors.isEmpty) { hasMore.value = false; - loadMoreController.loadNoData(); + refreshController.loadNoData(); } else { visitors.addAll(newVisitors); - loadMoreController.loadComplete(); - hasMore.value = false; + refreshController.loadComplete(); + hasMore.value = true; } } @@ -145,7 +147,7 @@ class VisitorController extends GetxController { @override void onClose() { refreshController.dispose(); - loadMoreController.dispose(); + // loadMoreController.dispose(); super.onClose(); } } \ No newline at end of file diff --git a/lib/controller/home/home_controller.dart b/lib/controller/home/home_controller.dart index 8b4a7c9..d946abf 100644 --- a/lib/controller/home/home_controller.dart +++ b/lib/controller/home/home_controller.dart @@ -69,6 +69,7 @@ class HomeController extends GetxController { final int currentPage = result['current'] ?? 1; final int totalPages = result['pages'] ?? 1; recommendHasMore.value = currentPage < totalPages; + print(recommendHasMore.value); } catch (e) { _handleError('获取推荐列表异常', e, '推荐列表加载失败,请稍后重试'); } finally { diff --git a/lib/controller/mine/user_controller.dart b/lib/controller/mine/user_controller.dart index 31fc56e..7b39662 100644 --- a/lib/controller/mine/user_controller.dart +++ b/lib/controller/mine/user_controller.dart @@ -2,6 +2,7 @@ import 'package:dating_touchme_app/im/im_manager.dart'; import 'package:dating_touchme_app/oss/oss_manager.dart'; import 'package:get/get.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; +import 'package:get_storage/get_storage.dart'; import '../../model/mine/authentication_data.dart'; import '../../model/mine/user_data.dart'; import '../../network/user_api.dart'; @@ -13,6 +14,7 @@ class UserController extends GetxController { // UserApi实例 late UserApi _userApi; + final storage = GetStorage(); @override void onInit() { @@ -118,6 +120,7 @@ class UserController extends GetxController { Get.offAll(() => UserInfoPage()); } } else if(!isMain){ + await storage.write('userId', userId); Get.offAll(MainPage()); } } diff --git a/lib/pages/discover/discover_page.dart b/lib/pages/discover/discover_page.dart index 6413dbc..0d121dd 100644 --- a/lib/pages/discover/discover_page.dart +++ b/lib/pages/discover/discover_page.dart @@ -5,6 +5,7 @@ import 'package:dating_touchme_app/pages/discover/live_room_page.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:tdesign_flutter/tdesign_flutter.dart'; class DiscoverPage extends StatefulWidget { const DiscoverPage({super.key}); @@ -14,7 +15,7 @@ class DiscoverPage extends StatefulWidget { } class _DiscoverPageState extends State - with AutomaticKeepAliveClientMixin { + with AutomaticKeepAliveClientMixin, TickerProviderStateMixin { late final RoomController roomController; List topNav = ["相亲", "聚会脱单"]; @@ -32,8 +33,6 @@ class _DiscoverPageState extends State {"isNew": false}, ]; - List tabList = ["全部", "同城", "相亲视频", "相亲语音"]; - int active = 0; void changeNav(int active) { @@ -63,8 +62,8 @@ class _DiscoverPageState extends State ), Container( padding: EdgeInsets.symmetric(horizontal: 12.w), - constraints: BoxConstraints(minHeight: ScreenUtil().setHeight(800)), - + height: MediaQuery.of(context).size.height - 64, + // constraints: BoxConstraints(minHeight: ScreenUtil().setHeight(800)), child: Column( children: [ HomeAppbar( @@ -94,59 +93,28 @@ class _DiscoverPageState extends State ), ), ), - Container( - width: 351.w, - height: 45.w, - child: SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - ...tabList.asMap().entries.map((entry) { - return Container( - margin: EdgeInsets.only(right: 27.w), - child: InkWell( - onTap: () { - active = entry.key; - setState(() {}); - }, - child: Container( - height: 21.w, - padding: EdgeInsets.symmetric( - horizontal: active == entry.key ? 30.w : 0, - ), - decoration: BoxDecoration( - borderRadius: BorderRadius.all( - Radius.circular(21.w), - ), - color: Color.fromRGBO( - 108, - 105, - 244, - active == entry.key ? 1 : 0, - ), - ), - child: Center( - child: Text( - entry.value, - style: TextStyle( - fontSize: 12.w, - color: active == entry.key - ? Colors.white - : const Color.fromRGBO(51, 51, 51, .7), - fontWeight: active == entry.key - ? FontWeight.w700 - : FontWeight.w500, - ), - ), - ), - ), - ), - ); - }), - ], - ), - ), + 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: 12, left: 12), child: Text('相亲视频'))), + TDTab(child: Padding(padding: EdgeInsets.only(right: 12, left: 12), child: Text('相亲语音'))) + ], + // width: MediaQuery.of(context).size.width - 64, + 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: TabController(length: 4, vsync: this), + showIndicator: false, + isScrollable: true, + onTap: (index){ + print(index); + }, ), Expanded( child: SingleChildScrollView( diff --git a/lib/pages/discover/visitor_list_page.dart b/lib/pages/discover/visitor_list_page.dart index 1645f48..4aa5c36 100644 --- a/lib/pages/discover/visitor_list_page.dart +++ b/lib/pages/discover/visitor_list_page.dart @@ -92,7 +92,7 @@ class _VisitorListPagePageState extends State { return SmartRefresher( controller: visitorController.refreshController, enablePullDown: true, - enablePullUp: visitorController.hasMore.value, + enablePullUp: true, onRefresh: visitorController.onRefresh, onLoading: visitorController.onLoadMore, header: ClassicHeader( diff --git a/lib/pages/home/content_card.dart b/lib/pages/home/content_card.dart index ec8b384..45e5b15 100644 --- a/lib/pages/home/content_card.dart +++ b/lib/pages/home/content_card.dart @@ -36,7 +36,7 @@ class _CardHeader extends StatelessWidget { child: ClipRRect( borderRadius: BorderRadius.circular(30), child: CachedNetworkImage( - imageUrl: item.avatar, + imageUrl: '${item.avatar}?x-oss-process=image/format,webp/resize,w_320', width: 60, height: 60, imageBuilder: (context, imageProvider) => Container( @@ -263,7 +263,7 @@ class _CardHeader extends StatelessWidget { // 统一的内容卡片组件,根据接口数据显示不同状态 class ContentCard extends StatelessWidget { final MarriageData item; - const ContentCard({required this.item}); + ContentCard({required this.item}); @override Widget build(BuildContext context) { @@ -382,18 +382,25 @@ class _NetworkImageWidget extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - image: DecorationImage( - image: imageUrl.isNotEmpty - ? NetworkImage(imageUrl) - : AssetImage(Assets.imagesAvatarsExample) as ImageProvider, + return CachedNetworkImage( + imageUrl: '$imageUrl?x-oss-process=image/format,webp/resize,w_320', + width: double.infinity, + height: double.infinity, + imageBuilder: (context, imageProvider) => Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, + ), + ), + ), + errorWidget: (context, url, error) => Image.asset( + Assets.imagesAvatarsExample, + width: 60, + height: 60, fit: BoxFit.cover, ), - ), - width: double.infinity, - height: double.infinity, ); } } diff --git a/lib/pages/home/recommend_tab.dart b/lib/pages/home/recommend_tab.dart index 7804380..f14ed10 100644 --- a/lib/pages/home/recommend_tab.dart +++ b/lib/pages/home/recommend_tab.dart @@ -37,101 +37,117 @@ class _RecommendTabState extends State final bottomPadding = MediaQuery.of(context).padding.bottom; final tabBarHeight = 64.0; final totalBottomPadding = bottomPadding + tabBarHeight; + return SizedBox( + height: MediaQuery.of(context).size.height - totalBottomPadding, + child: Obx(() { + final List dataSource = controller.recommendFeed; - return Obx(() { - final List dataSource = controller.recommendFeed; - final bool hasMore = controller.recommendHasMore.value; - - return SmartRefresher( - controller: _refreshController, - enablePullDown: true, - enablePullUp: true, - header: const ClassicHeader( - refreshingText: '正在刷新...', - completeText: '刷新完成', - idleText: '下拉刷新', - releaseText: '释放刷新', - ), - footer: ClassicFooter( - idleText: '上拉加载', - loadingText: '正在加载...', - noDataText: '没有更多数据', - canLoadingText: '释放加载', - ), - // 下拉刷新 - onRefresh: () async { - print('推荐列表下拉刷新被触发'); - try { - await controller.refreshRecommendData(); - _refreshController.refreshCompleted(); - print('推荐列表刷新完成'); - } catch (e) { - print('推荐列表刷新失败: $e'); - _refreshController.refreshFailed(); - } - }, - // 上拉加载更多 - onLoading: () async { - print('推荐列表上拉加载被触发, hasMore: $hasMore'); - if (hasMore && controller.recommendHasMore.value) { - try { - await controller.loadRecommendMoreData(); - // 完成加载,根据是否有更多数据决定 - if (controller.recommendHasMore.value) { - _refreshController.loadComplete(); - print('推荐列表加载更多成功'); - } else { - _refreshController.loadNoData(); - print('推荐列表没有更多数据了'); - } - } catch (e) { - print('推荐列表加载更多失败: $e'); - _refreshController.loadFailed(); - } - } else { - _refreshController.loadNoData(); - print('推荐列表没有更多数据'); - } - }, - child: ListView.separated( - // 关键:始终允许滚动,即使内容不足 - physics: const AlwaysScrollableScrollPhysics( - parent: BouncingScrollPhysics(), + return SmartRefresher( + controller: _refreshController, + enablePullDown: true, + enablePullUp: true, + physics: const ClampingScrollPhysics(), + header: const ClassicHeader( + refreshingText: '正在刷新...', + completeText: '刷新完成', + idleText: '下拉刷新', + releaseText: '释放刷新', ), - // 移除顶部 padding,让刷新指示器可以正确显示在 AppBar 下方 - padding: EdgeInsets.only( - left: 12, - right: 12, - bottom: totalBottomPadding + 12, + footer: ClassicFooter( + idleText: '上拉加载', + loadingText: '正在加载...', + noDataText: '没有更多数据', + canLoadingText: '释放加载', ), - itemBuilder: (context, index) { - // 空数据状态 - if (dataSource.isEmpty && index == 0) { - // 使用足够的高度确保可以滚动 - return SizedBox( - height: MediaQuery.of(context).size.height * 1.2, - child: const Center( - child: Text( - "暂无数据", - style: TextStyle(fontSize: 14, color: Color(0xFF999999)), - ), - ), - ); + // 下拉刷新 + onRefresh: () async { + print('推荐列表下拉刷新被触发'); + try { + await controller.refreshRecommendData(); + print('推荐列表刷新完成, hasMore: $controller.recommendHasMore.value'); + _refreshController.refreshCompleted(); + _refreshController.loadComplete(); + } catch (e) { + print('推荐列表刷新失败: $e'); + _refreshController.refreshFailed(); } - // 数据项 - final item = dataSource[index]; - return ContentCard(item: item); }, - separatorBuilder: (context, index) { - // 空状态或加载状态时不显示分隔符 - if (dataSource.isEmpty) return const SizedBox.shrink(); - return const SizedBox(height: 12); + // 上拉加载更多 + onLoading: () async { + print('推荐列表上拉加载被触发, hasMore: $controller.recommendHasMore.value'); + if (controller.recommendHasMore.value) { + try { + await controller.loadRecommendMoreData(); + // 完成加载,根据是否有更多数据决定 + if (controller.recommendHasMore.value) { + _refreshController.loadComplete(); + print('推荐列表加载更多成功'); + } else { + _refreshController.loadNoData(); + print('推荐列表没有更多数据了'); + } + } catch (e) { + print('推荐列表加载更多失败: $e'); + _refreshController.loadFailed(); + } + } else { + _refreshController.loadNoData(); + print('推荐列表没有更多数据'); + } }, - // 至少显示一个 item(用于显示加载或空状态) - itemCount: dataSource.isEmpty ? 1 : dataSource.length, - ), - ); - }); + child: ListView.separated( + // 关键:始终允许滚动,即使内容不足 + // 移除顶部 padding,让刷新指示器可以正确显示在 AppBar 下方 + padding: EdgeInsets.only( + left: 12, + right: 12, + bottom: 12, + ), + itemBuilder: (context, index) { + // 空数据状态 + if (dataSource.isEmpty && index == 0) { + // 使用足够的高度确保可以滚动 + if(controller.recommendIsLoading.value){ + return SizedBox( + height: MediaQuery.of(context).size.height - totalBottomPadding, + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CircularProgressIndicator(), + SizedBox(height: 16), + Text('加载数据中...'), + ], + ), + ), + ); + } else { + return SizedBox( + height: MediaQuery.of(context).size.height - totalBottomPadding, + child: const Center( + child: Text( + "暂无数据", + style: TextStyle(fontSize: 14, color: Color(0xFF999999)), + ), + ), + ); + } + } + // 数据项 + final item = dataSource[index]; + return ContentCard(item: item); + }, + separatorBuilder: (context, index) { + // 空状态或加载状态时不显示分隔符 + if (dataSource.isEmpty) return const SizedBox.shrink(); + return const SizedBox(height: 12); + }, + // 至少显示一个 item(用于显示加载或空状态) + itemCount: dataSource.isEmpty ? 1 : dataSource.length, + ), + ); + }), + ); } @override