import 'package:blog_app/apis/blog.dart'; import 'package:blog_app/models/blog.dart'; import 'package:blog_app/widget/easy_refresh.dart'; import 'package:blog_app/widget/blog.dart'; import 'package:easy_refresh/easy_refresh.dart'; import 'package:flutter/material.dart'; class BlogPage extends StatefulWidget { const BlogPage({super.key}); @override State createState() => _BlogPageState(); } class _BlogPageState extends State { late List blogList = []; int _currentPage = 1; final int _pageSize = 5; bool _hasMore = true; bool _showScrollToTop = false; final EasyRefreshController _freshController = EasyRefreshController( controlFinishRefresh: true, controlFinishLoad: true, ); 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 queryBlogByPageApi(_currentPage, _pageSize); setState(() { if (isRefresh) { // 刷新时直接替换数据 blogList = result.records; } else { // 加载更多时追加数据 blogList.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() => scrollToTopAnimateTo(_scrollController); Widget buildBlogList() { return ListView.builder( controller: _scrollController, itemCount: blogList.length, itemBuilder: (context, index) { final blog = blogList[index]; return InkWell( onTap: () => navigatorToBlogDetail(context, blog.id), child: BlogCard(blog: blogList[index]), ); }, ); } @override Widget build(BuildContext context) { return Stack( children: [ buildEasyRefresh( freshController: _freshController, onRefresh: _onRefresh, onLoad: _onLoad, body: buildBlogList(), ), if (_showScrollToTop) buildScrollToTop(context: context, scrollToTop: _scrollToTop), ], ); } }