diff --git a/lib/controller/discover/visitor_controller.dart b/lib/controller/discover/visitor_controller.dart index 45e0790..f8c5c44 100644 --- a/lib/controller/discover/visitor_controller.dart +++ b/lib/controller/discover/visitor_controller.dart @@ -1,7 +1,6 @@ // controllers/visitor_controller.dart import 'package:easy_refresh/easy_refresh.dart'; import 'package:get/get.dart'; -import 'package:pull_to_refresh/pull_to_refresh.dart'; import '../../model/discover/visitor_model.dart'; class VisitorController extends GetxController { @@ -13,7 +12,6 @@ class VisitorController extends GetxController { controlFinishRefresh: true, controlFinishLoad: true, ); - // final RefreshController loadMoreController = RefreshController(); // 分页参数 var currentPage = 1.obs; @@ -147,8 +145,7 @@ class VisitorController extends GetxController { @override void onClose() { - // refreshController.dispose(); - // loadMoreController.dispose(); + refreshController.dispose(); super.onClose(); } } \ No newline at end of file diff --git a/lib/pages/home/nearby_tab.dart b/lib/pages/home/nearby_tab.dart index aa0bcfb..b4c5ff3 100644 --- a/lib/pages/home/nearby_tab.dart +++ b/lib/pages/home/nearby_tab.dart @@ -1,8 +1,7 @@ +import 'package:easy_refresh/easy_refresh.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:dating_touchme_app/controller/home/home_controller.dart'; -import 'package:dating_touchme_app/model/home/marriage_data.dart'; import 'package:dating_touchme_app/pages/home/content_card.dart'; /// 同城列表 Tab @@ -13,15 +12,14 @@ class NearbyTab extends StatefulWidget { State createState() => _NearbyTabState(); } -class _NearbyTabState extends State - with AutomaticKeepAliveClientMixin { +class _NearbyTabState extends State with AutomaticKeepAliveClientMixin { final HomeController controller = Get.find(); - late final RefreshController _refreshController; + late final EasyRefreshController _refreshController; @override void initState() { super.initState(); - _refreshController = RefreshController(initialRefresh: false); + _refreshController = EasyRefreshController(controlFinishRefresh: true, controlFinishLoad: true); } @override @@ -38,104 +36,97 @@ class _NearbyTabState extends State final tabBarHeight = 64.0; final totalBottomPadding = bottomPadding + tabBarHeight; - return SizedBox( - height: MediaQuery.of(context).size.height - totalBottomPadding, - child: Obx(() { - final List dataSource = controller.nearbyFeed; - - return SmartRefresher( + return Obx(() { + return EasyRefresh( controller: _refreshController, - enablePullDown: true, - enablePullUp: true, header: const ClassicHeader( - refreshingText: '正在刷新...', - completeText: '刷新完成', - idleText: '下拉刷新', - releaseText: '释放刷新', + dragText: '下拉刷新', + armedText: '释放刷新', + readyText: '刷新中...', + processingText: '刷新中...', + processedText: '刷新完成', + failedText: '刷新失败', + noMoreText: '没有更多数据', + showMessage: false ), footer: ClassicFooter( - idleText: '上拉加载', - loadingText: '正在加载...', - noDataText: '没有更多数据', - canLoadingText: '释放加载', + dragText: '上拉加载', + armedText: '释放加载', + readyText: '加载中...', + processingText: '加载中...', + processedText: '加载完成', + failedText: '加载失败', + noMoreText: '没有更多数据', + showMessage: false ), // 下拉刷新 onRefresh: () async { print('同城列表下拉刷新被触发'); try { await controller.refreshNearbyData(); - _refreshController.refreshCompleted(); - _refreshController.loadComplete(); + _refreshController.finishRefresh(); + _refreshController.resetFooter(); print('同城列表刷新完成'); } catch (e) { print('同城列表刷新失败: $e'); - _refreshController.refreshFailed(); + _refreshController.finishRefresh(IndicatorResult.fail); } }, // 上拉加载更多 - onLoading: () async { + onLoad: () async { print('同城列表上拉加载被触发, hasMore: ${controller.nearbyHasMore.value}'); - if (controller.nearbyHasMore.value) { - try { - await controller.loadNearbyMoreData(); - // 完成加载,根据是否有更多数据决定 - if (controller.nearbyHasMore.value) { - _refreshController.loadComplete(); - print('同城列表加载更多成功'); - } else { - _refreshController.loadNoData(); - print('同城列表没有更多数据了'); - } - } catch (e) { - print('同城列表加载更多失败: $e'); - _refreshController.loadFailed(); + try { + await controller.loadNearbyMoreData(); + // 完成加载,根据是否有更多数据决定 + if (controller.nearbyHasMore.value) { + _refreshController.finishLoad(IndicatorResult.success); + print('同城列表加载更多成功'); + } else { + _refreshController.finishLoad(IndicatorResult.noMore); + print('同城列表没有更多数据了'); } - } else { - _refreshController.loadNoData(); - print('同城列表没有更多数据'); + } catch (e) { + print('同城列表加载更多失败: $e'); + _refreshController.finishLoad(IndicatorResult.fail); } }, - child: ListView.separated( - // 关键:始终允许滚动,即使内容不足 - physics: const AlwaysScrollableScrollPhysics( - parent: BouncingScrollPhysics(), - ), - // 移除顶部 padding,让刷新指示器可以正确显示在 AppBar 下方 - padding: EdgeInsets.only( - left: 12, - right: 12, - bottom: 12, - ), - itemBuilder: (context, index) { - // 空数据状态 - if (dataSource.isEmpty && index == 0) { - // 使用足够的高度确保可以滚动 - return SizedBox( - height: MediaQuery.of(context).size.height - totalBottomPadding, - child: const Center( - child: Text( - "暂无数据", - style: TextStyle(fontSize: 14, color: Color(0xFF999999)), + child: SizedBox( + height: MediaQuery.of(context).size.height - totalBottomPadding, + child: ListView.separated( + // 移除顶部 padding,让刷新指示器可以正确显示在 AppBar 下方 + padding: EdgeInsets.only(left: 12, right: 12, bottom: 12), + itemBuilder: (context, index) { + // 空数据状态 + if (controller.nearbyFeed.isEmpty && index == 0) { + // 使用足够的高度确保可以滚动 + 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, + ); + } + // 数据项 + final item = controller.nearbyFeed[index]; + return ContentCard(item: item); + }, + separatorBuilder: (context, index) { + // 空状态或加载状态时不显示分隔符 + if (controller.nearbyFeed.isEmpty) return const SizedBox.shrink(); + return const SizedBox(height: 12); + }, + // 至少显示一个 item(用于显示加载或空状态) + itemCount: controller.nearbyFeed.isEmpty ? 1 : controller.nearbyFeed.length, + ) ), ); - })); + }); } @override bool get wantKeepAlive => true; + } diff --git a/lib/pages/home/recommend_tab.dart b/lib/pages/home/recommend_tab.dart index 0bd6b6d..cb4da7b 100644 --- a/lib/pages/home/recommend_tab.dart +++ b/lib/pages/home/recommend_tab.dart @@ -2,7 +2,6 @@ import 'package:easy_refresh/easy_refresh.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:dating_touchme_app/controller/home/home_controller.dart'; -import 'package:dating_touchme_app/model/home/marriage_data.dart'; import 'package:dating_touchme_app/pages/home/content_card.dart'; /// 推荐列表 Tab @@ -16,17 +15,17 @@ class RecommendTab extends StatefulWidget { class _RecommendTabState extends State with AutomaticKeepAliveClientMixin { final HomeController controller = Get.find(); - // late final RefreshController _refreshController; + late final EasyRefreshController _refreshController; @override void initState() { super.initState(); - // _refreshController = RefreshController(initialRefresh: false); + _refreshController = EasyRefreshController(controlFinishRefresh: true, controlFinishLoad: true); } @override void dispose() { - // _refreshController.dispose(); + _refreshController.dispose(); super.dispose(); } @@ -38,10 +37,8 @@ class _RecommendTabState extends State final tabBarHeight = 64.0; final totalBottomPadding = bottomPadding + tabBarHeight; return Obx(() { - // final List dataSource = controller.recommendFeed; - return EasyRefresh( - controller: EasyRefreshController(), + controller: _refreshController, header: const ClassicHeader( dragText: '下拉刷新', armedText: '释放刷新', @@ -67,49 +64,38 @@ class _RecommendTabState extends State print('推荐列表下拉刷新被触发'); try { await controller.refreshRecommendData(); - print( - '推荐列表刷新完成, hasMore: $controller.recommendHasMore.value'); - - // _refreshController.loadComplete(); + print( '推荐列表刷新完成, hasMore: $controller.recommendHasMore.value'); + _refreshController.finishRefresh(); + _refreshController.resetFooter(); } catch (e) { print('推荐列表刷新失败: $e'); - // _refreshController.refreshFailed(); + _refreshController.finishRefresh(IndicatorResult.fail); } }, // 上拉加载更多 onLoad: () 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(); + print('推荐列表上拉加载被触发, hasMore: $controller.recommendHasMore.value'); + try { + await controller.loadRecommendMoreData(); + // 完成加载,根据是否有更多数据决定 + if (controller.recommendHasMore.value) { + _refreshController.finishLoad(IndicatorResult.success); + print('推荐列表加载更多成功'); + } else { + _refreshController.finishLoad(IndicatorResult.noMore); + print('推荐列表没有更多数据了'); } - } else { - // _refreshController.loadNoData(); - print('推荐列表没有更多数据'); + } catch (e) { + print('推荐列表加载更多失败: $e'); + _refreshController.finishLoad(IndicatorResult.fail); } }, - child: SizedBox( - height: MediaQuery.of(context).size.height - totalBottomPadding, - child: ListView.separated( + child: SizedBox( + height: MediaQuery.of(context).size.height - totalBottomPadding, + child: ListView.separated( // 关键:始终允许滚动,即使内容不足 // 移除顶部 padding,让刷新指示器可以正确显示在 AppBar 下方 - padding: EdgeInsets.only( - left: 12, - right: 12, - bottom: 12, - ), + padding: EdgeInsets.only(left: 12, right: 12, bottom: 12), itemBuilder: (context, index) { // 空数据状态 if (controller.recommendFeed.isEmpty && index == 0) { @@ -130,10 +116,7 @@ class _RecommendTabState extends State ); } else { return SizedBox( - height: MediaQuery - .of(context) - .size - .height - totalBottomPadding, + height: MediaQuery.of(context).size.height - totalBottomPadding, child: const Center( child: Text( "暂无数据", @@ -150,12 +133,12 @@ class _RecommendTabState extends State separatorBuilder: (context, index) { // 空状态或加载状态时不显示分隔符 if (controller.recommendFeed.isEmpty) return const SizedBox.shrink(); - return const SizedBox(height: 12); - }, - // 至少显示一个 item(用于显示加载或空状态) - itemCount: controller.recommendFeed.isEmpty ? 1 : controller.recommendFeed.length, - ) - ), + return const SizedBox(height: 12); + }, + // 至少显示一个 item(用于显示加载或空状态) + itemCount: controller.recommendFeed.isEmpty ? 1 : controller.recommendFeed.length, + ) + ), ); }); } diff --git a/pubspec.yaml b/pubspec.yaml index 6df0360..c373d63 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -69,7 +69,6 @@ dependencies: # fluwx: ^5.7.5 # tobias: ^5.3.1 agora_rtc_engine: ^6.5.3 - pull_to_refresh: ^2.0.0 agora_rtm: ^2.2.5 agora_token_generator: ^1.0.0 location_plugin: