import 'package:flutter/material.dart'; import 'package:flutter_common/widget/chart.dart'; import 'package:flutter_common/widget/common_widget.dart'; import 'package:food_hub_app/provider/food_provider.dart'; import 'package:food_hub_app/widgets/stats/card.dart'; import 'package:provider/provider.dart'; class StatsPage extends StatefulWidget { const StatsPage({super.key}); @override State createState() => _StatsPage(); } class _StatsPage extends State { final double chartHeight = 400; @override void initState() { super.initState(); // 初始化加载数据 WidgetsBinding.instance.addPostFrameCallback((_) { context.read().refreshFoodStats(); }); } Widget _buildSummaryStats(FoodProvider provider) { return GridView.count( shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), // 禁用网格自身滚动 crossAxisCount: 2, crossAxisSpacing: 8, mainAxisSpacing: 8, childAspectRatio: 2, children: [ StatisticCard( icon: Icons.restaurant_menu, color: Colors.blue, title: '菜谱总数', value: provider.summaryStats.recipeCount, unit: '个', ), StatisticCard( icon: Icons.grid_view_rounded, color: Colors.green, title: '菜谱类别', value: provider.summaryStats.categoryCount, unit: '种', ), StatisticCard( icon: Icons.flag, color: Colors.orange, title: '做菜次数', value: provider.summaryStats.workCount, unit: '个', ), StatisticCard( icon: Icons.show_chart, color: Colors.red, title: '平均次数', value: double.parse(provider.averageRecordCount.toStringAsFixed(2)), unit: '次/月', ), ], ); } Widget _buildContent(FoodProvider provider) { return Column( children: [ _buildSummaryStats(provider), SizedBox(height: 8), SizedBox( height: chartHeight, child: CommonCard( child: LineChart( title: '记录统计', xAxisName: '日期', yAxisName: '次数', unit: '次', data: provider.recordStats, ), ), ), SizedBox(height: 8), SizedBox( height: chartHeight, child: CommonCard( child: PieChart( title: '菜谱统计', unit: '个', data: provider.categoryStats, ), ), ), SizedBox(height: 8), SizedBox( height: chartHeight, child: CommonCard( child: RankChart(title: '排行榜', data: provider.rankStats, unit: '次'), ), ), ], ); } @override Widget build(BuildContext context) { final provider = context.watch(); return Stack( children: [ if (provider.isLoading) buildLoadingIndicator() else SingleChildScrollView(child: _buildContent(provider)), ], ); } }