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 class NearbyTab extends StatefulWidget { const NearbyTab({super.key}); @override State createState() => _NearbyTabState(); } class _NearbyTabState extends State with AutomaticKeepAliveClientMixin { final HomeController controller = Get.find(); late final RefreshController _refreshController; @override void initState() { super.initState(); _refreshController = RefreshController(initialRefresh: false); } @override void dispose() { _refreshController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { super.build(context); // 获取底部安全区域高度和 tabbar 高度(约64) 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.nearbyFeed; 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.refreshNearbyData(); _refreshController.refreshCompleted(); _refreshController.loadComplete(); print('同城列表刷新完成'); } catch (e) { print('同城列表刷新失败: $e'); _refreshController.refreshFailed(); } }, // 上拉加载更多 onLoading: () 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(); } } else { _refreshController.loadNoData(); print('同城列表没有更多数据'); } }, 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)), ), ), ); } // 数据项 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 bool get wantKeepAlive => true; }