import 'package:easy_refresh/easy_refresh.dart'; import 'package:flutter/material.dart'; import 'package:food_hub_app/api/moment.dart'; import 'package:food_hub_app/models/moment.dart'; import 'package:food_hub_app/widgets/moment/card.dart'; import 'package:tdesign_flutter/tdesign_flutter.dart'; class MomentPage extends StatefulWidget { const MomentPage({super.key}); @override State createState() => _MomentPageState(); } class _MomentPageState extends State { List momentList = []; int _currentPage = 1; final int _pageSize = 3; bool _hasMore = true; // 初始化EasyRefresh控制器 final EasyRefreshController _freshController = EasyRefreshController( controlFinishRefresh: true, controlFinishLoad: true, ); bool _showScrollToTop = false; final ScrollController _scrollController = ScrollController(); @override void initState() { super.initState(); // 初始加载数据 _loadData(isRefresh: true); _scrollController.addListener(_onScroll); } @override void dispose() { _scrollController.removeListener(_onScroll); _freshController.dispose(); _scrollController.dispose(); super.dispose(); } // 统一的数据加载方法 Future _loadData({required bool isRefresh}) async { try { // 如果是刷新,重置页码 if (isRefresh) { _currentPage = 1; } final result = await queryMomentByPageApi(_currentPage, _pageSize); setState(() { if (isRefresh) { // 刷新时直接替换数据 momentList = result.records; } else { // 加载更多时追加数据 momentList.addAll(result.records); } // 判断是否还有更多数据 _hasMore = result.current < result.pages; // 如果有更多数据,准备加载下一页 if (_hasMore) { _currentPage++; } }); } catch (e) { // 处理错误 debugPrint('加载数据失败: $e'); } finally { _freshController.finishRefresh(); _freshController.resetFooter(); } } // 下拉刷新 Future _onRefresh() async { await _loadData(isRefresh: true); } // 上拉加载 Future _onLoad() async { if (_hasMore) { await _loadData(isRefresh: false); _freshController.finishLoad(IndicatorResult.success); } else { _freshController.finishLoad(IndicatorResult.noMore); } } void _onScroll() { // 当滚动距离超过300时显示返回顶部按钮 if (_scrollController.offset > 300) { if (!_showScrollToTop) { setState(() { _showScrollToTop = true; }); } } else { if (_showScrollToTop) { setState(() { _showScrollToTop = false; }); } } } // 滚动到顶部 void _scrollToTop() { _scrollController.animateTo( 0, duration: const Duration(milliseconds: 500), // 滚动动画时长 curve: Curves.easeInOut, // 滚动动画曲线 ); } @override Widget build(BuildContext context) { // 空状态显示 if (momentList.isEmpty) { return EasyRefresh( controller: _freshController, onRefresh: _onRefresh, child: const TDEmpty(type: TDEmptyType.plain, emptyText: '暂无数据'), ); } // 有数据时显示列表 return Stack( children: [ Padding( padding: const EdgeInsets.all(5), child: EasyRefresh( controller: _freshController, header: ClassicHeader( dragText: '下拉刷新', armedText: '释放刷新', readyText: '准备刷新', processingText: '刷新中...', processedText: '刷新完成', failedText: '刷新失败', noMoreText: '没有更多数据', showText: true, messageText: '更新于 %T', showMessage: true, ), footer: ClassicFooter( dragText: '上拉加载', armedText: '释放加载', readyText: '准备加载', processingText: '加载中...', processedText: '加载完成', failedText: '加载失败', noMoreText: '没有更多数据', showText: true, messageText: '更新于 %T', showMessage: true, ), onRefresh: _onRefresh, onLoad: _onLoad, child: ListView.builder( controller: _scrollController, itemCount: momentList.length, itemBuilder: (context, index) { return MomentCard(moment: momentList[index]); }, ), ), ), // 返回顶部按钮 if (_showScrollToTop) Positioned( right: 10, bottom: 20, child: FloatingActionButton( onPressed: _scrollToTop, backgroundColor: Colors.white, elevation: 5, mini: true, child: const Icon( Icons.arrow_upward ), ), ), ], ); } }