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_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),
);
}

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_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<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
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 {
late HealthRecord formItem;
String date = formatDate(DateTime.now());
DateTime selectedDate = DateTime.now();
DateTime focusedDate = DateTime.now();
RecordType type = RecordType.weight;
bool isEditing = false;

View File

@@ -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),
);

View File

@@ -21,7 +21,7 @@ class RecordDaily extends StatefulWidget {
class _RecordDailyState extends State<RecordDaily> {
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<RecordDaily> {
WidgetsBinding.instance.addPostFrameCallback((_) {
final provider = context.read<HealthProvider>();
_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<RecordDaily> {
await service.updateRecord(provider.formItem);
setState(() {
_record = service.getAllRecordByDate(provider.date);
_record = service.getRecordByDate(provider.selectedDate);
});
provider.updateLatestWeight(service.getLatestWeight());

View File

@@ -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:

View File

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