feat:更新目标模块
This commit is contained in:
@@ -1,9 +1,13 @@
|
||||
import 'package:fitnote/models/health.dart';
|
||||
import 'package:fitnote/provider/health_provider.dart';
|
||||
import 'package:fitnote/service/health_service.dart';
|
||||
import 'package:fitnote/utils/record_utils.dart';
|
||||
import 'package:fitnote/widget/record/common.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:provider/provider.dart';
|
||||
|
||||
class GoalProgress extends StatefulWidget {
|
||||
const GoalProgress({super.key});
|
||||
@@ -13,8 +17,29 @@ class GoalProgress extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _GoalProgressState extends State<GoalProgress> {
|
||||
final HealthService service = HealthService();
|
||||
|
||||
final int initWeight = 72;
|
||||
final int goalWeight = 70;
|
||||
final int goalTotalSpot = 600;
|
||||
final int goalAvgSleep = 8;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
final provider = context.read<HealthProvider>();
|
||||
provider.totalSpot = service.getTotalSport();
|
||||
provider.avgSleep = service.getAvgSleep();
|
||||
provider.latestWeight = service.getLatestWeight();
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final provider = context.watch<HealthProvider>();
|
||||
|
||||
return CommonCard(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
@@ -27,28 +52,28 @@ class _GoalProgressState extends State<GoalProgress> {
|
||||
const SizedBox(height: 28),
|
||||
_buildProgressItem(
|
||||
title: '目标体重',
|
||||
current: '65.2',
|
||||
target: '60',
|
||||
current: provider.latestWeight.toString(),
|
||||
target: goalWeight.toString(),
|
||||
unit: 'kg',
|
||||
progress: 0.85,
|
||||
progress: calWeightProgress(provider.latestWeight, goalWeight, initWeight),
|
||||
color: RecordType.weight.color,
|
||||
),
|
||||
const SizedBox(height: 28),
|
||||
_buildProgressItem(
|
||||
title: '运动总时长',
|
||||
current: '450',
|
||||
target: '600',
|
||||
current: provider.totalSpot.toString(),
|
||||
target: goalTotalSpot.toString(),
|
||||
unit: '分钟',
|
||||
progress: 0.75,
|
||||
progress: formatProgress(provider.totalSpot / goalTotalSpot),
|
||||
color: RecordType.sport.color,
|
||||
),
|
||||
const SizedBox(height: 28),
|
||||
_buildProgressItem(
|
||||
title: '日均睡眠',
|
||||
current: '7.2',
|
||||
target: '8',
|
||||
current: provider.avgSleep.toString(),
|
||||
target: goalAvgSleep.toString(),
|
||||
unit: '小时',
|
||||
progress: 0.9,
|
||||
progress: formatProgress(provider.avgSleep / goalAvgSleep),
|
||||
color: RecordType.sleep.color,
|
||||
),
|
||||
],
|
||||
|
||||
@@ -161,9 +161,33 @@ class _RecordDailyState extends State<RecordDaily> {
|
||||
provider.type = type;
|
||||
|
||||
if (provider.isEditing) {
|
||||
_initRecord(provider);
|
||||
switch (provider.type) {
|
||||
case RecordType.weight:
|
||||
provider.updateWeight(_record.weight);
|
||||
break;
|
||||
case RecordType.sport:
|
||||
provider.updateSportProject(_record.sportProject);
|
||||
provider.updateSportDuration(_record.sportDuration);
|
||||
break;
|
||||
case RecordType.sleep:
|
||||
provider.updateSleepStartTime(_record.sleepStartTime);
|
||||
provider.updateSleepEndTime(_record.sleepEndTime);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
_defaultRecord(provider);
|
||||
switch (provider.type) {
|
||||
case RecordType.weight:
|
||||
provider.updateWeight(70);
|
||||
break;
|
||||
case RecordType.sport:
|
||||
provider.updateSportProject('跑步');
|
||||
provider.updateSportDuration(30);
|
||||
break;
|
||||
case RecordType.sleep:
|
||||
provider.updateSleepStartTime('');
|
||||
provider.updateSleepEndTime('');
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
showDialog(
|
||||
@@ -211,42 +235,22 @@ class _RecordDailyState extends State<RecordDaily> {
|
||||
);
|
||||
}
|
||||
|
||||
void _initRecord(HealthProvider provider) {
|
||||
switch (provider.type) {
|
||||
case RecordType.weight:
|
||||
provider.updateWeight(_record.weight);
|
||||
break;
|
||||
case RecordType.sport:
|
||||
provider.updateSportProject(_record.sportProject);
|
||||
provider.updateSportDuration(_record.sportDuration);
|
||||
break;
|
||||
case RecordType.sleep:
|
||||
provider.updateSleepStartTime(_record.sleepStartTime);
|
||||
provider.updateSleepEndTime(_record.sleepEndTime);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void _resetRecord() {
|
||||
final provider = context.read<HealthProvider>();
|
||||
if (!provider.isEditing) {
|
||||
_defaultRecord(provider);
|
||||
}
|
||||
}
|
||||
|
||||
void _defaultRecord(HealthProvider provider) {
|
||||
switch (provider.type) {
|
||||
case RecordType.weight:
|
||||
provider.updateWeight(70);
|
||||
break;
|
||||
case RecordType.sport:
|
||||
provider.updateSportProject('跑步');
|
||||
provider.updateSportDuration(30);
|
||||
break;
|
||||
case RecordType.sleep:
|
||||
provider.updateSleepStartTime('');
|
||||
provider.updateSleepEndTime('');
|
||||
break;
|
||||
switch (provider.type) {
|
||||
case RecordType.weight:
|
||||
provider.updateWeight(0);
|
||||
break;
|
||||
case RecordType.sport:
|
||||
provider.updateSportProject('跑步');
|
||||
provider.updateSportDuration(0);
|
||||
break;
|
||||
case RecordType.sleep:
|
||||
provider.updateSleepStartTime('');
|
||||
provider.updateSleepEndTime('');
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -257,6 +261,10 @@ class _RecordDailyState extends State<RecordDaily> {
|
||||
setState(() {
|
||||
_record = service.getAllRecordByDate(provider.date);
|
||||
});
|
||||
|
||||
provider.updateLatestWeight(service.getLatestWeight());
|
||||
provider.updateTotalSpot(service.getTotalSport());
|
||||
provider.updateAvgSleep(service.getAvgSleep());
|
||||
}
|
||||
|
||||
Widget _buildRecordContent(RecordType type) {
|
||||
@@ -277,7 +285,7 @@ class _RecordDailyState extends State<RecordDaily> {
|
||||
final startTime = _record.sleepStartTime;
|
||||
final endTime = _record.sleepEndTime;
|
||||
if (startTime.isNotEmpty && endTime.isNotEmpty) {
|
||||
final duration = calculateDuration(startTime, endTime);
|
||||
final duration = calSleepDuration(startTime, endTime);
|
||||
title = "入睡 $startTime · 起床 $endTime · ${duration}";
|
||||
} else if (startTime.isNotEmpty) {
|
||||
title = "入睡 $startTime";
|
||||
|
||||
@@ -43,10 +43,10 @@ class _RecordFormState extends State<RecordForm> {
|
||||
Widget _buildSleepDuration(HealthRecord record) {
|
||||
final startTime = record.sleepStartTime;
|
||||
final endTime = record.sleepEndTime;
|
||||
late String duration = calculateDuration(startTime, endTime);
|
||||
late String duration = calSleepDuration(startTime, endTime);
|
||||
|
||||
if (startTime.isNotEmpty && endTime.isNotEmpty) {
|
||||
duration = calculateDuration(startTime, endTime);
|
||||
duration = calSleepDuration(startTime, endTime);
|
||||
} else {
|
||||
duration = "";
|
||||
}
|
||||
@@ -151,7 +151,7 @@ class _RecordFormState extends State<RecordForm> {
|
||||
provider.updateSleepStartTime(formatTime(time));
|
||||
final startTime = provider.formItem.sleepStartTime;
|
||||
final endTime = provider.formItem.sleepEndTime;
|
||||
calculateDuration(startTime, endTime);
|
||||
calSleepDuration(startTime, endTime);
|
||||
},
|
||||
),
|
||||
],
|
||||
@@ -169,7 +169,7 @@ class _RecordFormState extends State<RecordForm> {
|
||||
provider.updateSleepEndTime(formatTime(time));
|
||||
final startTime = provider.formItem.sleepStartTime;
|
||||
final endTime = provider.formItem.sleepEndTime;
|
||||
calculateDuration(startTime, endTime);
|
||||
calSleepDuration(startTime, endTime);
|
||||
},
|
||||
),
|
||||
],
|
||||
|
||||
Reference in New Issue
Block a user