feat:增加历史记录

This commit is contained in:
2025-12-02 18:58:07 +08:00
parent 86852cc47d
commit 62108248aa
7 changed files with 89 additions and 11 deletions

View File

@@ -1,4 +1,5 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter_common/flutter_common.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
@@ -38,7 +39,7 @@ class HealthRecord extends HiveObject {
required this.date, required this.date,
}); });
static HealthRecord getEmpty(String date) { static HealthRecord getEmpty(DateTime date) {
return HealthRecord( return HealthRecord(
id: DateTime.now().millisecondsSinceEpoch ~/ 1000, id: DateTime.now().millisecondsSinceEpoch ~/ 1000,
sportProject: '', sportProject: '',
@@ -46,7 +47,7 @@ class HealthRecord extends HiveObject {
weight: 0, weight: 0,
sleepStartTime: '', sleepStartTime: '',
sleepEndTime: '', sleepEndTime: '',
date: date, date: formatDate(date),
); );
} }

View File

@@ -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/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 { class HistoryPage extends StatefulWidget {
const HistoryPage({super.key}); const HistoryPage({super.key});
@@ -8,8 +14,61 @@ class HistoryPage extends StatefulWidget {
} }
class _HistoryPageState extends State<HistoryPage> { class _HistoryPageState extends State<HistoryPage> {
final HealthService service = HealthService();
TableCalendar _calendar() {
final provider = context.watch<HealthProvider>();
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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Center(child: Text('历史记录')); return SingleChildScrollView(
child: Column(
children: [
CommonCard(child: _calendar()),
const SizedBox(height: 24),
RecordDaily(),
],
),
);
} }
} }

View File

@@ -4,7 +4,8 @@ import 'package:flutter_common/flutter_common.dart';
class HealthProvider with ChangeNotifier { class HealthProvider with ChangeNotifier {
late HealthRecord formItem; late HealthRecord formItem;
String date = formatDate(DateTime.now()); DateTime selectedDate = DateTime.now();
DateTime focusedDate = DateTime.now();
RecordType type = RecordType.weight; RecordType type = RecordType.weight;
bool isEditing = false; bool isEditing = false;

View File

@@ -1,5 +1,6 @@
import 'package:fitnote/models/health.dart'; import 'package:fitnote/models/health.dart';
import 'package:fitnote/utils/record_utils.dart'; import 'package:fitnote/utils/record_utils.dart';
import 'package:flutter_common/flutter_common.dart';
import 'package:hive_flutter/hive_flutter.dart'; import 'package:hive_flutter/hive_flutter.dart';
class HealthService { class HealthService {
@@ -20,9 +21,9 @@ class HealthService {
return box.values.toList(); return box.values.toList();
} }
HealthRecord getAllRecordByDate(String date) { HealthRecord getRecordByDate(DateTime date) {
final record = box.values.toList().firstWhere( final record = box.values.toList().firstWhere(
(item) => item.date == date, (item) => item.date == formatDate(date),
orElse: () => HealthRecord.getEmpty(date), orElse: () => HealthRecord.getEmpty(date),
); );

View File

@@ -21,7 +21,7 @@ class RecordDaily extends StatefulWidget {
class _RecordDailyState extends State<RecordDaily> { class _RecordDailyState extends State<RecordDaily> {
final HealthService service = HealthService(); final HealthService service = HealthService();
HealthRecord _record = HealthRecord.getEmpty(''); HealthRecord _record = HealthRecord.getEmpty(DateTime.now());
@override @override
void initState() { void initState() {
@@ -29,8 +29,8 @@ class _RecordDailyState extends State<RecordDaily> {
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
final provider = context.read<HealthProvider>(); final provider = context.read<HealthProvider>();
_record = service.getAllRecordByDate(provider.date); _record = service.getRecordByDate(provider.selectedDate);
provider.initForm(HealthRecord.getEmpty(provider.date)); provider.initForm(HealthRecord.getEmpty(provider.selectedDate));
}); });
} }
@@ -259,7 +259,7 @@ class _RecordDailyState extends State<RecordDaily> {
await service.updateRecord(provider.formItem); await service.updateRecord(provider.formItem);
setState(() { setState(() {
_record = service.getAllRecordByDate(provider.date); _record = service.getRecordByDate(provider.selectedDate);
}); });
provider.updateLatestWeight(service.getLatestWeight()); provider.updateLatestWeight(service.getLatestWeight());

View File

@@ -817,6 +817,14 @@ packages:
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "3.0.0" 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: sky_engine:
dependency: transitive dependency: transitive
description: flutter description: flutter
@@ -894,6 +902,14 @@ packages:
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "30.2.7" 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: term_glyph:
dependency: transitive dependency: transitive
description: description:

View File

@@ -1 +1 @@
name: fitnote name: fitnote