From 98900e2cd2685c4e5154e786f1d2536f8f595d96 Mon Sep 17 00:00:00 2001 From: ZHR007 Date: Fri, 21 Nov 2025 11:56:47 +0800 Subject: [PATCH] no message --- .../discover/visitor_controller.dart | 23 +- lib/pages/discover/visitor_list_page.dart | 49 ++-- lib/pages/home/recommend_tab.dart | 225 +++++++++--------- pubspec.yaml | 1 + 4 files changed, 150 insertions(+), 148 deletions(-) diff --git a/lib/controller/discover/visitor_controller.dart b/lib/controller/discover/visitor_controller.dart index 8ff3a63..45e0790 100644 --- a/lib/controller/discover/visitor_controller.dart +++ b/lib/controller/discover/visitor_controller.dart @@ -1,4 +1,5 @@ // 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'; @@ -8,7 +9,10 @@ class VisitorController extends GetxController { var visitors = [].obs; // Refresh controllers - final RefreshController refreshController = RefreshController(); + final EasyRefreshController refreshController = EasyRefreshController( + controlFinishRefresh: true, + controlFinishLoad: true, + ); // final RefreshController loadMoreController = RefreshController(); // 分页参数 @@ -45,22 +49,19 @@ class VisitorController extends GetxController { final newVisitors = _generateMockData(1, pageSize); visitors.assignAll(newVisitors); - refreshController.refreshCompleted(); + refreshController.finishRefresh(); + refreshController.resetFooter(); hasMore.value = newVisitors.length == pageSize; if (newVisitors.isEmpty) { - refreshController.loadNoData(); - } else { - refreshController.loadComplete(); + hasMore.value = false; } - print(56); } // 上拉加载更多 void onLoadMore() async { print('onLoadMore'); if (!hasMore.value) { - refreshController.loadNoData(); return; } @@ -72,11 +73,11 @@ class VisitorController extends GetxController { if (newVisitors.isEmpty) { hasMore.value = false; - refreshController.loadNoData(); + refreshController.finishLoad(IndicatorResult.noMore); } else { visitors.addAll(newVisitors); - refreshController.loadComplete(); - hasMore.value = true; + // hasMore.value = true; + refreshController.finishLoad(IndicatorResult.success); } } @@ -146,7 +147,7 @@ class VisitorController extends GetxController { @override void onClose() { - refreshController.dispose(); + // refreshController.dispose(); // loadMoreController.dispose(); super.onClose(); } diff --git a/lib/pages/discover/visitor_list_page.dart b/lib/pages/discover/visitor_list_page.dart index 4aa5c36..da8c8e6 100644 --- a/lib/pages/discover/visitor_list_page.dart +++ b/lib/pages/discover/visitor_list_page.dart @@ -1,10 +1,10 @@ // pages/visitor_list_page.dart import 'package:cached_network_image/cached_network_image.dart'; import 'package:dating_touchme_app/extension/ex_widget.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'; -import 'package:pull_to_refresh/pull_to_refresh.dart'; import '../../controller/discover/visitor_controller.dart'; import '../../model/discover/visitor_model.dart'; @@ -89,39 +89,30 @@ class _VisitorListPagePageState extends State { ); } - return SmartRefresher( + return EasyRefresh( controller: visitorController.refreshController, - enablePullDown: true, - enablePullUp: true, onRefresh: visitorController.onRefresh, - onLoading: visitorController.onLoadMore, + onLoad: visitorController.onLoadMore, header: ClassicHeader( - idleText: '下拉刷新', - releaseText: '松开刷新', - refreshingText: '刷新中...', - completeText: '刷新完成', + dragText: '下拉刷新', + armedText: '释放刷新', + readyText: '刷新中...', + processingText: '刷新中...', + processedText: '刷新完成', failedText: '刷新失败', - height: 60, + noMoreText: '没有更多数据', + messageText: '更新时间 %T', + showMessage: false ), - footer: CustomFooter( - builder: (BuildContext context, LoadStatus? mode) { - Widget body; - if (mode == LoadStatus.idle) { - body = Text("上拉加载更多"); - } else if (mode == LoadStatus.loading) { - body = SizedBox(width: 20, height: 20, child: CircularProgressIndicator(strokeWidth: 2,)); - } else if (mode == LoadStatus.failed) { - body = Text("加载失败,点击重试"); - } else if (mode == LoadStatus.canLoading) { - body = Text("松开加载更多"); - } else { - body = Text("没有更多数据了"); - } - return SizedBox( - height: 36, - child: Center(child: body), - ); - }, + footer: ClassicFooter( + dragText: '上拉加载', + armedText: '释放加载', + readyText: '加载中...', + processingText: '加载中...', + processedText: '加载完成', + failedText: '加载失败', + noMoreText: '没有更多数据', + showMessage: false ), child: ListView.builder( padding: const EdgeInsets.only(top: 8, right: 10, left: 10), diff --git a/lib/pages/home/recommend_tab.dart b/lib/pages/home/recommend_tab.dart index c8da8ba..0bd6b6d 100644 --- a/lib/pages/home/recommend_tab.dart +++ b/lib/pages/home/recommend_tab.dart @@ -1,6 +1,6 @@ +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'; @@ -16,17 +16,17 @@ class RecommendTab extends StatefulWidget { class _RecommendTabState extends State with AutomaticKeepAliveClientMixin { final HomeController controller = Get.find(); - late final RefreshController _refreshController; + // late final RefreshController _refreshController; @override void initState() { super.initState(); - _refreshController = RefreshController(initialRefresh: false); + // _refreshController = RefreshController(initialRefresh: false); } @override void dispose() { - _refreshController.dispose(); + // _refreshController.dispose(); super.dispose(); } @@ -37,118 +37,127 @@ 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; - return SmartRefresher( - controller: _refreshController, - enablePullDown: true, - enablePullUp: true, - physics: const ClampingScrollPhysics(), - header: const ClassicHeader( - refreshingText: '正在刷新...', - completeText: '刷新完成', - idleText: '下拉刷新', - releaseText: '释放刷新', - ), - footer: ClassicFooter( - idleText: '上拉加载', - loadingText: '正在加载...', - noDataText: '没有更多数据', - canLoadingText: '释放加载', - ), - // 下拉刷新 - onRefresh: () async { - print('推荐列表下拉刷新被触发'); + return EasyRefresh( + controller: EasyRefreshController(), + 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('推荐列表下拉刷新被触发'); + try { + await controller.refreshRecommendData(); + print( + '推荐列表刷新完成, hasMore: $controller.recommendHasMore.value'); + + // _refreshController.loadComplete(); + } catch (e) { + print('推荐列表刷新失败: $e'); + // _refreshController.refreshFailed(); + } + }, + // 上拉加载更多 + onLoad: () async { + print( + '推荐列表上拉加载被触发, hasMore: $controller.recommendHasMore.value'); + if (controller.recommendHasMore.value) { try { - await controller.refreshRecommendData(); - print('推荐列表刷新完成, hasMore: $controller.recommendHasMore.value'); - _refreshController.refreshCompleted(); - _refreshController.loadComplete(); - } catch (e) { - print('推荐列表刷新失败: $e'); - _refreshController.refreshFailed(); - } - }, - // 上拉加载更多 - 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(); + await controller.loadRecommendMoreData(); + // 完成加载,根据是否有更多数据决定 + if (controller.recommendHasMore.value) { + // _refreshController.loadComplete(); + print('推荐列表加载更多成功'); + } else { + // _refreshController.loadNoData(); + print('推荐列表没有更多数据了'); } - } else { - _refreshController.loadNoData(); - print('推荐列表没有更多数据'); + } catch (e) { + print('推荐列表加载更多失败: $e'); + // _refreshController.loadFailed(); } - }, - child: ListView.separated( - // 关键:始终允许滚动,即使内容不足 - physics: AlwaysScrollableScrollPhysics(), // 保持一致的滚动物理 - // 移除顶部 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 { + // _refreshController.loadNoData(); + print('推荐列表没有更多数据'); + } + }, + 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.recommendFeed.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)), - ), + ), + ); + } 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, + } + // 数据项 + final item = controller.recommendFeed[index]; + return ContentCard(item: item); + }, + 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, + ) ), - ); - }), - ); + ); + }); } @override diff --git a/pubspec.yaml b/pubspec.yaml index 655924f..6df0360 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -53,6 +53,7 @@ dependencies: permission_handler: ^12.0.1 flustars: ^2.0.1 easy_refresh: ^3.4.0 + keframe: ^3.0.0 # 分帧组件 cached_network_image: ^3.4.1 # 图片加载 extended_image: ^9.0.4 # 图片查看器 wechat_assets_picker: ^9.8.0