import 'package:dating_touchme_app/controller/home/timeline_controller.dart'; import 'package:dating_touchme_app/pages/home/timeline_item.dart'; import 'package:easy_refresh/easy_refresh.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; /// 推荐列表 Tab class AllTimeline extends StatefulWidget { const AllTimeline({super.key}); @override State createState() => _AllTimelineState(); } class _AllTimelineState extends State with AutomaticKeepAliveClientMixin { late final TimelineController controller; late final EasyRefreshController _refreshController; @override void initState() { super.initState(); // 确保 TimelineController 已注册 if (!Get.isRegistered()) { Get.put(TimelineController()); } controller = Get.find(); _refreshController = EasyRefreshController(controlFinishRefresh: true, controlFinishLoad: true); } @override void dispose() { _refreshController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { super.build(context); return Obx(() { if (controller.recommendIsLoading.value && controller.postList.isEmpty) { return Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ CircularProgressIndicator(), SizedBox(height: 16), Text('加载数据中...'), ], ), ); } return EasyRefresh( controller: _refreshController, 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 { controller.page.value = 1; controller.postList.clear(); await controller.loadPostList(); print( '推荐列表刷新完成, hasMore: $controller.recommendHasMore.value'); _refreshController.finishRefresh(); _refreshController.resetFooter(); } catch (e) { print('推荐列表刷新失败: $e'); _refreshController.finishRefresh(IndicatorResult.fail); } }, // 上拉加载更多 onLoad: () async { print('推荐列表上拉加载被触发, hasMore: $controller.recommendHasMore.value'); try { controller.page.value += 1; await controller.loadPostList(); // 完成加载,根据是否有更多数据决定 if (controller.hasMore.value) { _refreshController.finishLoad(IndicatorResult.success); print('推荐列表加载更多成功'); } else { _refreshController.finishLoad(IndicatorResult.noMore); print('推荐列表没有更多数据了'); } } catch (e) { print('推荐列表加载更多失败: $e'); _refreshController.finishLoad(IndicatorResult.fail); } }, child: ListView.separated( // 关键:始终允许滚动,即使内容不足 // 移除顶部 padding,让刷新指示器可以正确显示在 AppBar 下方 padding: EdgeInsets.only(left: 12, right: 12), itemBuilder: (context, index) { // 空数据状态 if (controller.postList.isEmpty && index == 0) { // 使用足够的高度确保可以滚动 if (controller.recommendIsLoading.value) { return Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ CircularProgressIndicator(), SizedBox(height: 16), Text('加载数据中...'), ], ), ); } else { return Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text('暂无数据'), ], ), ); } } // 数据项 final item = controller.postList[index]; return TimelineItem(item: item,); }, separatorBuilder: (context, index) { // 空状态或加载状态时不显示分隔符 if (controller.postList.isEmpty) { return const SizedBox.shrink(); } return const SizedBox(height: 12); }, // 至少显示一个 item(用于显示加载或空状态) itemCount: controller.postList.length, ) ); }); } @override bool get wantKeepAlive => true; }