diff --git a/lib/models/health.dart b/lib/models/health.dart index dbf739a..65035f0 100644 --- a/lib/models/health.dart +++ b/lib/models/health.dart @@ -9,7 +9,7 @@ part 'health.g.dart'; @HiveType(typeId: 0) class HealthRecord extends HiveObject { @HiveField(0) - int id; + String date; @HiveField(1) String sportProject; @@ -26,11 +26,7 @@ class HealthRecord extends HiveObject { @HiveField(5) String sleepEndTime; - @HiveField(7) - String date; - HealthRecord({ - required this.id, required this.sportProject, required this.sportDuration, required this.weight, @@ -41,7 +37,6 @@ class HealthRecord extends HiveObject { static HealthRecord getEmpty(DateTime date) { return HealthRecord( - id: DateTime.now().millisecondsSinceEpoch ~/ 1000, sportProject: '', sportDuration: 0, weight: 0, @@ -61,13 +56,12 @@ class HealthRecord extends HiveObject { String? date, }) { return HealthRecord( - id: id ?? this.id, date: date ?? this.date, weight: weight ?? this.weight, sportProject: sportProject ?? this.sportProject, sportDuration: sportDuration ?? this.sportDuration, sleepStartTime: sleepStartTime ?? this.sleepStartTime, - sleepEndTime: sleepEndTime ?? this.sleepEndTime + sleepEndTime: sleepEndTime ?? this.sleepEndTime, ); } } diff --git a/lib/models/health.g.dart b/lib/models/health.g.dart index 6eaf411..4d33e72 100644 --- a/lib/models/health.g.dart +++ b/lib/models/health.g.dart @@ -17,22 +17,21 @@ class HealthRecordAdapter extends TypeAdapter { for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), }; return HealthRecord( - id: fields[0] as int, sportProject: fields[1] as String, sportDuration: fields[2] as num, weight: fields[3] as num, sleepStartTime: fields[4] as String, sleepEndTime: fields[5] as String, - date: fields[7] as String, + date: fields[0] as String, ); } @override void write(BinaryWriter writer, HealthRecord obj) { writer - ..writeByte(7) + ..writeByte(6) ..writeByte(0) - ..write(obj.id) + ..write(obj.date) ..writeByte(1) ..write(obj.sportProject) ..writeByte(2) @@ -42,9 +41,7 @@ class HealthRecordAdapter extends TypeAdapter { ..writeByte(4) ..write(obj.sleepStartTime) ..writeByte(5) - ..write(obj.sleepEndTime) - ..writeByte(7) - ..write(obj.date); + ..write(obj.sleepEndTime); } @override diff --git a/lib/pages/history_page.dart b/lib/pages/history_page.dart index 097ec32..7365a80 100644 --- a/lib/pages/history_page.dart +++ b/lib/pages/history_page.dart @@ -32,30 +32,10 @@ class _HistoryPageState extends State { 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(); - }); + provider.updateSelectDate(selectedDay); + provider.updateRecord(service.getRecordByDate(provider.selectedDate)); } - }, - 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), - // ), + } ); } diff --git a/lib/provider/health_provider.dart b/lib/provider/health_provider.dart index fc16800..272fbaf 100644 --- a/lib/provider/health_provider.dart +++ b/lib/provider/health_provider.dart @@ -1,11 +1,10 @@ import 'package:fitnote/models/health.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_common/flutter_common.dart'; class HealthProvider with ChangeNotifier { - late HealthRecord formItem; + HealthRecord formItem = HealthRecord.getEmpty(DateTime.now()); + HealthRecord currentRecord = HealthRecord.getEmpty(DateTime.now()); DateTime selectedDate = DateTime.now(); - DateTime focusedDate = DateTime.now(); RecordType type = RecordType.weight; bool isEditing = false; @@ -18,6 +17,16 @@ class HealthProvider with ChangeNotifier { notifyListeners(); } + void updateRecord(HealthRecord record) { + currentRecord = record; + notifyListeners(); + } + + void updateSelectDate(DateTime date) { + selectedDate = date; + notifyListeners(); + } + void updateWeight(num weight) { formItem.weight = weight; notifyListeners(); diff --git a/lib/service/health_service.dart b/lib/service/health_service.dart index c4818ad..519153a 100644 --- a/lib/service/health_service.dart +++ b/lib/service/health_service.dart @@ -93,17 +93,18 @@ class HealthService { Future updateRecord(HealthRecord record) async { try { - List records = + print(record.date); + final existingRecords = box.values.where((item) => item.date == record.date).toList(); - if (records.isEmpty) { + if (existingRecords.isEmpty) { await addRecord(record); } else { await record.save(); } - return true; } catch (e) { + print(e.toString()); return false; } } diff --git a/lib/widget/record/record_daily.dart b/lib/widget/record/record_daily.dart index c1ebc24..b82a847 100644 --- a/lib/widget/record/record_daily.dart +++ b/lib/widget/record/record_daily.dart @@ -5,6 +5,7 @@ import 'package:fitnote/utils/record_utils.dart'; import 'package:fitnote/widget/record/common.dart'; import 'package:fitnote/widget/record/record_form.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_common/flutter_common.dart'; import 'package:flutter_common/widget/common_widget.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:getwidget/getwidget.dart'; @@ -21,16 +22,13 @@ class RecordDaily extends StatefulWidget { class _RecordDailyState extends State { final HealthService service = HealthService(); - HealthRecord _record = HealthRecord.getEmpty(DateTime.now()); - @override void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) { final provider = context.read(); - _record = service.getRecordByDate(provider.selectedDate); - provider.initForm(HealthRecord.getEmpty(provider.selectedDate)); + provider.currentRecord = service.getRecordByDate(provider.selectedDate); }); } @@ -68,6 +66,8 @@ class _RecordDailyState extends State { } Widget _buildTodayTag() { + final provider = context.watch(); + return Container( padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 4), decoration: BoxDecoration( @@ -75,7 +75,7 @@ class _RecordDailyState extends State { borderRadius: BorderRadius.circular(16), ), child: Text( - DateFormat('MM月dd日').format(DateTime.now()), + DateFormat('MM月dd日').format(provider.selectedDate), style: const TextStyle( fontSize: 12, color: Color(0xFF64748B), @@ -86,6 +86,8 @@ class _RecordDailyState extends State { } Widget _buildRecordListTile(RecordType type) { + final provider = context.watch(); + return Container( decoration: BoxDecoration( gradient: LinearGradient( @@ -125,7 +127,7 @@ class _RecordDailyState extends State { ), ), const SizedBox(height: 4), - _buildRecordContent(type), + _buildRecordContent(provider.currentRecord, type), ], ), trailing: GestureDetector( @@ -138,7 +140,7 @@ class _RecordDailyState extends State { borderRadius: BorderRadius.circular(20), ), child: Icon( - checkHasRecordValue(_record, type) + checkHasRecordValue(provider.currentRecord, type) ? FontAwesomeIcons.pencil : FontAwesomeIcons.plus, color: type.color, @@ -157,21 +159,23 @@ class _RecordDailyState extends State { void onTapRecord(RecordType type) { final provider = context.read(); - provider.isEditing = checkHasRecordValue(_record, type); + final record = provider.currentRecord; + + provider.isEditing = checkHasRecordValue(record, type); provider.type = type; if (provider.isEditing) { switch (provider.type) { case RecordType.weight: - provider.updateWeight(_record.weight); + provider.updateWeight(record.weight); break; case RecordType.sport: - provider.updateSportProject(_record.sportProject); - provider.updateSportDuration(_record.sportDuration); + provider.updateSportProject(record.sportProject); + provider.updateSportDuration(record.sportDuration); break; case RecordType.sleep: - provider.updateSleepStartTime(_record.sleepStartTime); - provider.updateSleepEndTime(_record.sleepEndTime); + provider.updateSleepStartTime(record.sleepStartTime); + provider.updateSleepEndTime(record.sleepEndTime); break; } } else { @@ -256,19 +260,18 @@ class _RecordDailyState extends State { void _saveRecord() async { final provider = context.read(); + provider.formItem.date = formatDate(provider.selectedDate); await service.updateRecord(provider.formItem); - setState(() { - _record = service.getRecordByDate(provider.selectedDate); - }); + provider.updateRecord(service.getRecordByDate(provider.selectedDate)); provider.updateLatestWeight(service.getLatestWeight()); provider.updateTotalSpot(service.getTotalSport()); provider.updateAvgSleep(service.getAvgSleep()); } - Widget _buildRecordContent(RecordType type) { - if (!checkHasRecordValue(_record, type)) { + Widget _buildRecordContent(HealthRecord record, RecordType type) { + if (!checkHasRecordValue(record, type)) { return Text( "尚未记录今日数据,点击添加", style: TextStyle(fontSize: 12, color: Colors.grey[500]), @@ -278,12 +281,12 @@ class _RecordDailyState extends State { late String title; switch (type) { case RecordType.weight: - title = "${_record.weight} kg"; + title = "${record.weight} kg"; case RecordType.sport: - title = "${_record.sportProject} · ${_record.sportDuration}分钟"; + title = "${record.sportProject} · ${record.sportDuration}分钟"; case RecordType.sleep: - final startTime = _record.sleepStartTime; - final endTime = _record.sleepEndTime; + final startTime = record.sleepStartTime; + final endTime = record.sleepEndTime; if (startTime.isNotEmpty && endTime.isNotEmpty) { final duration = calSleepDuration(startTime, endTime); title = "入睡 $startTime · 起床 $endTime · ${duration}";