import 'package:fitnote/config/app_config.dart'; import 'package:fitnote/models/health.dart'; import 'package:fitnote/provider/health_provider.dart'; import 'package:fitnote/service/health_service.dart'; import 'package:fitnote/utils/record_utils.dart'; import 'package:fitnote/widget/record/common.dart'; import 'package:flutter/material.dart'; import 'package:flutter_common/widget/common_widget.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:getwidget/getwidget.dart'; import 'package:provider/provider.dart'; class GoalProgress extends StatefulWidget { const GoalProgress({super.key}); @override State createState() => _GoalProgressState(); } class _GoalProgressState extends State { final HealthService service = HealthService(); @override void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) { final provider = context.read(); provider.totalSpot = service.getTotalSport(); provider.avgSleep = service.getAvgSleep(); provider.latestWeight = service.getLatestWeight(); provider.updateRecord(service.getRecordByDate(provider.selectedDate)); }); } @override Widget build(BuildContext context) { final provider = context.watch(); return CommonCard( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ buildCardTitle( context: context, title: '本月目标进度', icon: FontAwesomeIcons.trophy, ), const SizedBox(height: 28), _buildProgressItem( title: '目标体重', current: provider.latestWeight.toString(), target: AppConfig.goalWeight.toString(), unit: 'kg', progress: calWeightProgress( provider.latestWeight, AppConfig.goalWeight, AppConfig.initWeight, ), color: RecordType.weight.color, ), const SizedBox(height: 28), _buildProgressItem( title: '运动总时长', current: provider.totalSpot.toString(), target: AppConfig.goalTotalSpot.toString(), unit: '分钟', progress: formatProgress( provider.totalSpot / AppConfig.goalTotalSpot, ), color: RecordType.sport.color, ), const SizedBox(height: 28), _buildProgressItem( title: '日均睡眠', current: provider.avgSleep.toString(), target: AppConfig.goalAvgSleep.toString(), unit: '小时', progress: formatProgress( provider.avgSleep / AppConfig.goalAvgSleep, ), color: RecordType.sleep.color, ), ], ), ); } Widget _buildProgressItem({ required String title, required String current, required String target, required String unit, required double progress, required Color color, }) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text(title), Text( '$current/$target $unit', style: TextStyle(fontWeight: FontWeight.w500, color: color), ), ], ), const SizedBox(height: 8), GFProgressBar( animation: true, lineHeight: 20, percentage: progress, progressBarColor: color, child: Text( '${roundNum(progress * 100)}%', textAlign: TextAlign.end, style: TextStyle(color: Colors.white), ), ), ], ); } }