import 'package:fitnote/modesl/health.dart'; import 'package:fitnote/widget/dropdown_select.dart'; import 'package:fitnote/widget/number_input.dart'; import 'package:fitnote/widget/record/common.dart'; import 'package:fitnote/widget/select_input.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:intl/intl.dart'; import 'package:numberpicker/numberpicker.dart'; class TodayRecord extends StatefulWidget { const TodayRecord({super.key}); @override State createState() => _TodayRecordState(); } class _TodayRecordState extends State { final record = HealthRecord( id: 1, sportProject: '羽毛球', sportDuration: 20, sleepStartTime: '23:00', sleepEndTime: '24:00', sleepDuration: 60, weight: 0, date: '2025-11-28', ); final recordForm = HealthRecord( id: 1, sportProject: '羽毛球', sportDuration: 20, sleepStartTime: '23:00', sleepEndTime: '24:00', sleepDuration: 60, weight: 70, date: '2025-11-28', ); @override Widget build(BuildContext context) { return CommonCard( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ buildCardTitle( context: context, title: '今日记录', icon: FontAwesomeIcons.calendarCheck, ), _buildTodayTag(), ], ), const SizedBox(height: 20), ListView.separated( physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, itemCount: RecordType.values.length, separatorBuilder: (context, index) => SizedBox(height: 8), itemBuilder: (context, index) { final recordType = RecordType.values[index]; return _buildRecordListTile(recordType); }, ), ], ), ); } Widget _buildTodayTag() { return Container( padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 4), decoration: BoxDecoration( color: const Color(0xFFF1F5F9), borderRadius: BorderRadius.circular(16), ), child: Text( DateFormat('MM月dd日').format(DateTime.now()), style: const TextStyle( fontSize: 12, color: Color(0xFF64748B), fontWeight: FontWeight.w500, ), ), ); } Widget _buildRecordListTile(RecordType type) { return Container( decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topLeft, end: Alignment.bottomRight, colors: [type.color.withAlpha(10), Colors.white.withAlpha(200)], ), borderRadius: BorderRadius.circular(20), boxShadow: [ BoxShadow( color: Colors.black.withAlpha(10), blurRadius: 12, offset: const Offset(0, 4), ), ], ), child: ListTile( leading: Container( width: 48, height: 48, decoration: BoxDecoration( color: type.color.withAlpha(30), borderRadius: BorderRadius.circular(24), ), child: Icon(type.icon, color: type.color, size: 22), ), title: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ Text( type.title, style: TextStyle( fontSize: 16, fontWeight: FontWeight.bold, color: type.color, ), ), const SizedBox(height: 4), _buildRecordContent(type), ], ), trailing: GestureDetector( onTap: () => onTapRecord(type), child: Container( width: 40, height: 40, decoration: BoxDecoration( color: type.color.withAlpha(30), borderRadius: BorderRadius.circular(20), ), child: Icon( _checkHasRecordValue(type) ? FontAwesomeIcons.pencil : FontAwesomeIcons.plus, color: type.color, size: 18, ), ), ), splashColor: Colors.transparent, contentPadding: const EdgeInsets.symmetric( horizontal: 20, vertical: 12, ), ), ); } bool _checkHasRecordValue(RecordType type) { switch (type) { case RecordType.weight: return record.weight != null; case RecordType.sport: return record.sportProject != null; case RecordType.sleep: return record.sleepStartTime != null; } } Widget _buildDialogButton(RecordType type) { final colors = Theme.of(context).colorScheme; return Row( children: [ Expanded( child: GFButton( onPressed: () => Navigator.of(context).pop(), color: colors.secondary.withAlpha(100), text: "取消", ), ), const SizedBox(width: 12), Expanded( child: GFButton(onPressed: () {}, color: colors.primary, text: "确定"), ), ], ); } // void _saveRecordData(RecordType type) { // setState(() { // switch (type) { // case RecordType.weight: // record.weight = _dialogWeight; // break; // case RecordType.sport: // record.sportProject = _dialogSportProject; // record.sportDuration = _dialogSportDuration.toInt(); // break; // case RecordType.sleep: // // 处理睡眠数据 // break; // } // }); // } Widget _buildDialogTitle(String title) { return Text( title, style: TextStyle( fontSize: 18, fontWeight: FontWeight.bold, color: Theme.of(context).colorScheme.primary, ), ); } Widget _buildFiledTitle(String title) { return Text(title, style: TextStyle(fontSize: 16)); } Widget _buildDialogContent(RecordType type) { final colors = Theme.of(context).colorScheme; switch (type) { case RecordType.weight: return Column( mainAxisSize: MainAxisSize.min, children: [ _buildDialogTitle('记录体重'), SizedBox(height: 20), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ _buildFiledTitle('体重:'), SizedBox(width: 10), NumberInput( value: recordForm.weight!, min: 0, max: 100, step: 0.1, unit: 'Kg', onChanged: (value) => setState(() => recordForm.weight = value!), ), ], ), SizedBox(height: 20), _buildDialogButton(type), ], ); case RecordType.sport: return Column( mainAxisSize: MainAxisSize.min, children: [ _buildDialogTitle('记录运动'), SizedBox(height: 24), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ _buildFiledTitle('运动类型:'), SizedBox(width: 10), DropdownSelect( value: recordForm.sportProject!, items: ['羽毛球', '乒乓球', '篮球', '跑步'], onChanged: (newValue) { setState(() { recordForm.sportProject = newValue!; }); }, ), ], ), SizedBox(height: 20), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ // 运动时长 _buildFiledTitle('运动时长:'), SizedBox(width: 10), NumberInput( value: recordForm.sportDuration, min: 5, max: 240, step: 5, unit: '分钟', onChanged: (value) => setState(() => recordForm.sportDuration = value!), ), ], ), SizedBox(height: 24), _buildDialogButton(type), ], ); case RecordType.sleep: return Column( mainAxisSize: MainAxisSize.min, children: [ _buildFiledTitle('记录睡眠'), SizedBox(height: 20), // 这里添加睡眠相关的输入控件 SizedBox(height: 20), _buildDialogButton(type), ], ); } } void onTapRecord(RecordType type) { showDialog( context: context, builder: (context) => Dialog( child: Padding( padding: EdgeInsets.all(20), child: _buildDialogContent(type), ), ), ); } Widget _buildRecordContent(RecordType type) { if (!_checkHasRecordValue(type)) { return Text( "尚未记录今日数据,点击添加", style: TextStyle(fontSize: 12, color: Colors.grey[500]), ); } late String title; switch (type) { case RecordType.weight: title = "${record.weight} kg"; case RecordType.sport: title = "${record.sportProject} · ${record.sportDuration}分钟"; case RecordType.sleep: title = "入睡 ${record.sleepStartTime} · 起床 ${record.sleepEndTime} · ${record.sleepDuration}分钟"; } return Text( title, style: TextStyle( fontSize: 14, fontWeight: FontWeight.w500, color: Colors.grey[800], ), ); } }