Commit 2ec326af956fd2a14bd7a8b379f8b7f9366a3ebd

Authored by 刘宏哲
1 parent cb292aa9

feat(app): 修复HRV不刷新的问题

... ... @@ -38,6 +38,7 @@ class ActivityBurnReportLogic extends ReportPeriodLogic {
final weeklyReport = Rxn<WeeklyActivityBurnReport>();
final monthlyReport = Rxn<MonthlyActivityBurnReport>();
final _myUserId = Get.find<UserStateService>().userId;
int _reportRequestId = 0;
bool get isMySelf =>
targetUserId.value == null || _myUserId == targetUserId.value;
... ... @@ -50,28 +51,40 @@ class ActivityBurnReportLogic extends ReportPeriodLogic {
@override
Future<void> loadReport() async {
isLoading.value = !isMySelf;
final requestId = ++_reportRequestId;
final period = selectedPeriod.value;
final currentTargetUserId = targetUserId.value;
final isCurrentUser =
currentTargetUserId == null || _myUserId == currentTargetUserId;
isLoading.value = !isCurrentUser;
try {
if (selectedPeriod.value == ReportPeriod.week) {
weeklyReport.value = await repository.getWeeklyReport(
if (period == ReportPeriod.week) {
final result = await repository.getWeeklyReport(
weekStart,
targetUserId: targetUserId.value,
targetUserId: currentTargetUserId,
);
} else if (selectedPeriod.value == ReportPeriod.month) {
if (requestId != _reportRequestId) return;
weeklyReport.value = result;
} else if (period == ReportPeriod.month) {
final result = await repository.getMonthlyReport(
monthStart,
targetUserId: targetUserId.value,
targetUserId: currentTargetUserId,
);
if (requestId != _reportRequestId) return;
monthlyReport.value = result;
} else {
report.value = await repository.getDailyReport(
final result = await repository.getDailyReport(
selectedDate.value,
targetUserId: targetUserId.value,
targetUserId: currentTargetUserId,
);
if (requestId != _reportRequestId) return;
report.value = result;
}
} finally {
isLoading.value = false;
if (requestId == _reportRequestId) {
isLoading.value = false;
}
}
}
... ...
... ... @@ -265,6 +265,8 @@ class _HrvTrendSectionState extends State<_HrvTrendSection> {
Future<void> _syncExternalQuery() async {
_syncingExternalQuery = true;
final targetUserChanged =
_logic.targetUserId.value != widget.query.targetUserId;
_logic.targetUserId.value = widget.query.targetUserId;
_logHrvTrend(
'section_syncExternalQuery_start period=${widget.query.period.name} '
... ... @@ -276,7 +278,9 @@ class _HrvTrendSectionState extends State<_HrvTrendSection> {
await _logic.selectQuery(
widget.query.period,
widget.query.date,
forceRefresh: false,
// A user switch can keep the same period and date. Refresh in that
// case so the report is not left showing the previous user's data.
forceRefresh: targetUserChanged,
);
} else {
_logic.initializeQuery(widget.query.period, widget.query.date);
... ... @@ -391,9 +395,15 @@ class _ActivityBurnTrendSectionState extends State<_ActivityBurnTrendSection> {
Future<void> _syncExternalQuery() async {
_syncingExternalQuery = true;
final targetUserChanged =
_logic.targetUserId.value != widget.query.targetUserId;
_logic.targetUserId.value = widget.query.targetUserId;
try {
await _logic.selectQuery(widget.query.period, widget.query.date);
await _logic.selectQuery(
widget.query.period,
widget.query.date,
forceRefresh: targetUserChanged,
);
} finally {
_syncingExternalQuery = false;
}
... ... @@ -494,9 +504,15 @@ class _SleepTrendSectionState extends State<_SleepTrendSection> {
Future<void> _syncExternalQuery() async {
_syncingExternalQuery = true;
final targetUserChanged =
_logic.targetUserId.value != widget.query.targetUserId;
_logic.targetUserId.value = widget.query.targetUserId;
try {
await _logic.selectQuery(widget.query.period, widget.query.date);
await _logic.selectQuery(
widget.query.period,
widget.query.date,
forceRefresh: targetUserChanged,
);
} finally {
_syncingExternalQuery = false;
}
... ...
... ... @@ -63,6 +63,10 @@ class TrendController extends GetxController with HealthTrendControl {
final previousIndex = selectedTypeIndex.value;
super.changeType(index);
if (_isPageVisible && selectedTypeIndex.value != previousIndex) {
// The other report sections may have loaded while this tab was hidden.
// Refresh only the newly selected section through its selected-state
// guard so it does not show stale preloaded data.
refreshToken.value++;
_trackEnterPage();
}
}
... ...
... ... @@ -32,6 +32,7 @@ class HrvReportLogic extends ReportPeriodLogic {
final yearlyReport = Rxn<YearlyHrvReport>();
final HrvReportRepository repository;
final _myUserId = Get.find<UserStateService>().userId;
int _reportRequestId = 0;
static const _logMarker = '[OHOS_HRV_TREND_PROFILE]';
bool get isMySelf =>
targetUserId.value == null || _myUserId == targetUserId.value;
... ... @@ -51,41 +52,51 @@ class HrvReportLogic extends ReportPeriodLogic {
@override
Future<void> loadReport() async {
final requestId = ++_reportRequestId;
final stopwatch = Stopwatch()..start();
final period = selectedPeriod.value;
final date = selectedDate.value;
final currentTargetUserId = targetUserId.value;
final isCurrentUser =
currentTargetUserId == null || _myUserId == currentTargetUserId;
_log(
'logic_load_start period=${period.name} date=$date '
'targetUserId=${targetUserId.value} isMySelf=$isMySelf',
'targetUserId=$currentTargetUserId isMySelf=$isCurrentUser',
);
isLoading.value = !isMySelf;
isLoading.value = !isCurrentUser;
try {
if (period == ReportPeriod.year) {
yearlyReport.value = await repository.getYearlyReport(
final result = await repository.getYearlyReport(
date.year,
targetUserId: targetUserId.value,
targetUserId: currentTargetUserId,
);
if (requestId != _reportRequestId) return;
yearlyReport.value = result;
_log(
'logic_assign_finish period=${period.name} '
'days=${yearlyReport.value?.days.length ?? 0} '
'elapsedMs=${stopwatch.elapsedMilliseconds}',
);
} else if (period == ReportPeriod.month) {
monthlyReport.value = await repository.getMonthlyReport(
final result = await repository.getMonthlyReport(
monthStart,
targetUserId: targetUserId.value,
targetUserId: currentTargetUserId,
);
if (requestId != _reportRequestId) return;
monthlyReport.value = result;
_log(
'logic_assign_finish period=${period.name} '
'days=${monthlyReport.value?.days.length ?? 0} '
'elapsedMs=${stopwatch.elapsedMilliseconds}',
);
} else {
weeklyReport.value = await repository.getWeeklyReport(
final result = await repository.getWeeklyReport(
weekStart,
targetUserId: targetUserId.value,
targetUserId: currentTargetUserId,
);
if (requestId != _reportRequestId) return;
weeklyReport.value = result;
_log(
'logic_assign_finish period=${period.name} '
'days=${weeklyReport.value?.days.length ?? 0} '
... ... @@ -93,7 +104,9 @@ class HrvReportLogic extends ReportPeriodLogic {
);
}
} finally {
isLoading.value = false;
if (requestId == _reportRequestId) {
isLoading.value = false;
}
_log(
'logic_load_finish period=$period date=$date '
'elapsedMs=${stopwatch.elapsedMilliseconds}',
... ...
... ... @@ -38,6 +38,7 @@ class SleepReportLogic extends ReportPeriodLogic {
final weeklyReport = Rxn<WeeklySleepReport>();
final monthlyReport = Rxn<MonthlySleepReport>();
final _myUserId = Get.find<UserStateService>().userId;
int _reportRequestId = 0;
bool get isMySelf =>
targetUserId.value == null || _myUserId == targetUserId.value;
... ... @@ -60,39 +61,64 @@ class SleepReportLogic extends ReportPeriodLogic {
}
Future<void> loadDailyReport() async {
isLoading.value = !isMySelf;
final requestId = ++_reportRequestId;
final date = selectedDate.value;
final currentTargetUserId = targetUserId.value;
final isCurrentUser =
currentTargetUserId == null || _myUserId == currentTargetUserId;
isLoading.value = !isCurrentUser;
try {
report.value = await repository.getDailyReport(
selectedDate.value,
targetUserId: targetUserId.value,
final result = await repository.getDailyReport(
date,
targetUserId: currentTargetUserId,
);
if (requestId != _reportRequestId) return;
report.value = result;
} finally {
isLoading.value = false;
if (requestId == _reportRequestId) {
isLoading.value = false;
}
}
}
Future<void> loadWeeklyReport() async {
isLoading.value = !isMySelf;
final requestId = ++_reportRequestId;
final currentTargetUserId = targetUserId.value;
final isCurrentUser =
currentTargetUserId == null || _myUserId == currentTargetUserId;
isLoading.value = !isCurrentUser;
try {
weeklyReport.value = await repository.getWeeklyReport(
final result = await repository.getWeeklyReport(
weekStart,
targetUserId: targetUserId.value,
targetUserId: currentTargetUserId,
);
if (requestId != _reportRequestId) return;
weeklyReport.value = result;
} finally {
isLoading.value = false;
if (requestId == _reportRequestId) {
isLoading.value = false;
}
}
}
Future<void> loadMonthlyReport() async {
isLoading.value = !isMySelf;
final requestId = ++_reportRequestId;
final currentTargetUserId = targetUserId.value;
final isCurrentUser =
currentTargetUserId == null || _myUserId == currentTargetUserId;
isLoading.value = !isCurrentUser;
monthlyReport.value = null;
try {
monthlyReport.value = await repository.getMonthlyReport(
final result = await repository.getMonthlyReport(
monthStart,
targetUserId: targetUserId.value,
targetUserId: currentTargetUserId,
);
if (requestId != _reportRequestId) return;
monthlyReport.value = result;
} finally {
isLoading.value = false;
if (requestId == _reportRequestId) {
isLoading.value = false;
}
}
}
... ...