From 62108248aaae491dcdfad9f9171c4ba67b462194 Mon Sep 17 00:00:00 2001 From: Cxx0822 <1556464090@qq.com> Date: Tue, 2 Dec 2025 18:58:07 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=A2=9E=E5=8A=A0=E5=8E=86=E5=8F=B2?= =?UTF-8?q?=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/models/health.dart | 5 ++- lib/pages/history_page.dart | 61 ++++++++++++++++++++++++++++- lib/provider/health_provider.dart | 3 +- lib/service/health_service.dart | 5 ++- lib/widget/record/record_daily.dart | 8 ++-- pubspec.lock | 16 ++++++++ pubspec.yaml | 2 +- 7 files changed, 89 insertions(+), 11 deletions(-) diff --git a/lib/models/health.dart b/lib/models/health.dart index ea30254..dbf739a 100644 --- a/lib/models/health.dart +++ b/lib/models/health.dart @@ -1,4 +1,5 @@ import 'package:flutter/cupertino.dart'; +import 'package:flutter_common/flutter_common.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:hive/hive.dart'; @@ -38,7 +39,7 @@ class HealthRecord extends HiveObject { required this.date, }); - static HealthRecord getEmpty(String date) { + static HealthRecord getEmpty(DateTime date) { return HealthRecord( id: DateTime.now().millisecondsSinceEpoch ~/ 1000, sportProject: '', @@ -46,7 +47,7 @@ class HealthRecord extends HiveObject { weight: 0, sleepStartTime: '', sleepEndTime: '', - date: date, + date: formatDate(date), ); } diff --git a/lib/pages/history_page.dart b/lib/pages/history_page.dart index f332fb3..097ec32 100644 --- a/lib/pages/history_page.dart +++ b/lib/pages/history_page.dart @@ -1,4 +1,10 @@ +import 'package:fitnote/provider/health_provider.dart'; +import 'package:fitnote/service/health_service.dart'; +import 'package:fitnote/widget/record/record_daily.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_common/widget/common_widget.dart'; +import 'package:table_calendar/table_calendar.dart'; +import 'package:provider/provider.dart'; class HistoryPage extends StatefulWidget { const HistoryPage({super.key}); @@ -8,8 +14,61 @@ class HistoryPage extends StatefulWidget { } class _HistoryPageState extends State { + final HealthService service = HealthService(); + + TableCalendar _calendar() { + final provider = context.watch(); + + return TableCalendar( + locale: 'zh_CN', + headerStyle: const HeaderStyle( + headerPadding: EdgeInsets.symmetric(vertical: 0), + formatButtonVisible: false, + titleCentered: true, + ), + firstDay: DateTime.utc(2010, 1, 1), + lastDay: DateTime.utc(2100, 12, 31), + focusedDay: provider.selectedDate, + selectedDayPredicate: (day) => isSameDay(provider.selectedDate, day), + onDaySelected: (selectedDay, focusedDay) { + if (!isSameDay(provider.selectedDate, selectedDay)) { + setState(() { + provider.selectedDate = selectedDay; + provider.focusedDate = focusedDay; + // provider.updateRecord(service.getRecordByDate(provider.selectedDate)); + // provider.refreshSelectRecord(); + }); + } + }, + onPageChanged: (focusedDay) { + provider.focusedDate = focusedDay; + // provider.refreshRecordList(); + }, + // 自定义日期单元格构建器 + // calendarBuilders: CalendarBuilders( + // defaultBuilder: + // (context, day, focusedDay) => + // _buildDateItem(day, false, false, provider), + // selectedBuilder: + // (context, day, focusedDay) => + // _buildDateItem(day, true, false, provider), + // todayBuilder: + // (context, day, focusedDay) => + // _buildDateItem(day, false, true, provider), + // ), + ); + } + @override Widget build(BuildContext context) { - return Center(child: Text('历史记录')); + return SingleChildScrollView( + child: Column( + children: [ + CommonCard(child: _calendar()), + const SizedBox(height: 24), + RecordDaily(), + ], + ), + ); } } diff --git a/lib/provider/health_provider.dart b/lib/provider/health_provider.dart index b4ea9af..fc16800 100644 --- a/lib/provider/health_provider.dart +++ b/lib/provider/health_provider.dart @@ -4,7 +4,8 @@ import 'package:flutter_common/flutter_common.dart'; class HealthProvider with ChangeNotifier { late HealthRecord formItem; - String date = formatDate(DateTime.now()); + DateTime selectedDate = DateTime.now(); + DateTime focusedDate = DateTime.now(); RecordType type = RecordType.weight; bool isEditing = false; diff --git a/lib/service/health_service.dart b/lib/service/health_service.dart index e2da8be..c4818ad 100644 --- a/lib/service/health_service.dart +++ b/lib/service/health_service.dart @@ -1,5 +1,6 @@ import 'package:fitnote/models/health.dart'; import 'package:fitnote/utils/record_utils.dart'; +import 'package:flutter_common/flutter_common.dart'; import 'package:hive_flutter/hive_flutter.dart'; class HealthService { @@ -20,9 +21,9 @@ class HealthService { return box.values.toList(); } - HealthRecord getAllRecordByDate(String date) { + HealthRecord getRecordByDate(DateTime date) { final record = box.values.toList().firstWhere( - (item) => item.date == date, + (item) => item.date == formatDate(date), orElse: () => HealthRecord.getEmpty(date), ); diff --git a/lib/widget/record/record_daily.dart b/lib/widget/record/record_daily.dart index 171c6c4..c1ebc24 100644 --- a/lib/widget/record/record_daily.dart +++ b/lib/widget/record/record_daily.dart @@ -21,7 +21,7 @@ class RecordDaily extends StatefulWidget { class _RecordDailyState extends State { final HealthService service = HealthService(); - HealthRecord _record = HealthRecord.getEmpty(''); + HealthRecord _record = HealthRecord.getEmpty(DateTime.now()); @override void initState() { @@ -29,8 +29,8 @@ class _RecordDailyState extends State { WidgetsBinding.instance.addPostFrameCallback((_) { final provider = context.read(); - _record = service.getAllRecordByDate(provider.date); - provider.initForm(HealthRecord.getEmpty(provider.date)); + _record = service.getRecordByDate(provider.selectedDate); + provider.initForm(HealthRecord.getEmpty(provider.selectedDate)); }); } @@ -259,7 +259,7 @@ class _RecordDailyState extends State { await service.updateRecord(provider.formItem); setState(() { - _record = service.getAllRecordByDate(provider.date); + _record = service.getRecordByDate(provider.selectedDate); }); provider.updateLatestWeight(service.getLatestWeight()); diff --git a/pubspec.lock b/pubspec.lock index b7c41cc..bf14b38 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -817,6 +817,14 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "3.0.0" + simple_gesture_detector: + dependency: transitive + description: + name: simple_gesture_detector + sha256: ba2cd5af24ff20a0b8d609cec3f40e5b0744d2a71804a2616ae086b9c19d19a3 + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.2.1" sky_engine: dependency: transitive description: flutter @@ -894,6 +902,14 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "30.2.7" + table_calendar: + dependency: "direct main" + description: + name: table_calendar + sha256: b2896b7c86adf3a4d9c911d860120fe3dbe03c85db43b22fd61f14ee78cdbb63 + url: "https://pub.flutter-io.cn" + source: hosted + version: "3.1.3" term_glyph: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 3da665b..0f5fafe 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1 +1 @@ -name: fitnote description: "记录健康生活" publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: sdk: ^3.7.0 dependencies: flutter: sdk: flutter flutter_localizations: sdk: flutter cupertino_icons: ^1.0.8 getwidget: ^7.0.0 intl: ^0.19.0 font_awesome_flutter: ^10.7.0 hive: ^2.2.3 hive_flutter: ^1.1.0 numberpicker: ^2.1.2 provider: ^6.1.1 flutter_common: path: ..\flutter_common dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^5.0.0 hive_generator: ^2.0.1 build_runner: ^2.4.6 # The following section is specific to Flutter packages. flutter: uses-material-design: true \ No newline at end of file +name: fitnote description: "记录健康生活" publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: sdk: ^3.7.0 dependencies: flutter: sdk: flutter flutter_localizations: sdk: flutter cupertino_icons: ^1.0.8 getwidget: ^7.0.0 intl: ^0.19.0 font_awesome_flutter: ^10.7.0 hive: ^2.2.3 hive_flutter: ^1.1.0 numberpicker: ^2.1.2 provider: ^6.1.1 table_calendar: ^3.1.3 flutter_common: path: ..\flutter_common dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^5.0.0 hive_generator: ^2.0.1 build_runner: ^2.4.6 # The following section is specific to Flutter packages. flutter: uses-material-design: true \ No newline at end of file