Commit 573f5a3e1d2243ee0504cd917f93bb0d1ed4d372

Authored by 权海
1 parent 8fedd40b

feat(ui):使用临时内存保存原始数据提升计算速度

@@ -220,6 +220,8 @@ class _HrvTrendSection extends StatefulWidget { @@ -220,6 +220,8 @@ class _HrvTrendSection extends StatefulWidget {
220 } 220 }
221 221
222 class _HrvTrendSectionState extends State<_HrvTrendSection> { 222 class _HrvTrendSectionState extends State<_HrvTrendSection> {
  223 + static const _hrvTrendLogMarker = '[OHOS_HRV_TREND_PROFILE]';
  224 +
223 late final HrvReportLogic _logic; 225 late final HrvReportLogic _logic;
224 late final Worker _periodWorker; 226 late final Worker _periodWorker;
225 late final Worker _dateWorker; 227 late final Worker _dateWorker;
@@ -260,14 +262,27 @@ class _HrvTrendSectionState extends State<_HrvTrendSection> { @@ -260,14 +262,27 @@ class _HrvTrendSectionState extends State<_HrvTrendSection> {
260 Future<void> _syncExternalQuery() async { 262 Future<void> _syncExternalQuery() async {
261 _syncingExternalQuery = true; 263 _syncingExternalQuery = true;
262 _logic.targetUserId.value = widget.query.targetUserId; 264 _logic.targetUserId.value = widget.query.targetUserId;
  265 + _logHrvTrend(
  266 + 'section_syncExternalQuery_start period=${widget.query.period.name} '
  267 + 'date=${widget.query.date} targetUserId=${widget.query.targetUserId} '
  268 + 'isVip=${widget.isVip}',
  269 + );
263 try { 270 try {
264 if (widget.isVip) { 271 if (widget.isVip) {
265 - await _logic.selectQuery(widget.query.period, widget.query.date); 272 + await _logic.selectQuery(
  273 + widget.query.period,
  274 + widget.query.date,
  275 + forceRefresh: false,
  276 + );
266 } else { 277 } else {
267 _logic.initializeQuery(widget.query.period, widget.query.date); 278 _logic.initializeQuery(widget.query.period, widget.query.date);
268 } 279 }
269 } finally { 280 } finally {
270 _syncingExternalQuery = false; 281 _syncingExternalQuery = false;
  282 + _logHrvTrend(
  283 + 'section_syncExternalQuery_finish period=${widget.query.period.name} '
  284 + 'date=${widget.query.date}',
  285 + );
271 } 286 }
272 } 287 }
273 288
@@ -281,6 +296,11 @@ class _HrvTrendSectionState extends State<_HrvTrendSection> { @@ -281,6 +296,11 @@ class _HrvTrendSectionState extends State<_HrvTrendSection> {
281 Future.microtask(() { 296 Future.microtask(() {
282 _queryNotificationScheduled = false; 297 _queryNotificationScheduled = false;
283 if (!mounted || _syncingExternalQuery || !widget.isSelected) return; 298 if (!mounted || _syncingExternalQuery || !widget.isSelected) return;
  299 + _logHrvTrend(
  300 + 'section_notifyParentQueryChanged '
  301 + 'period=${_logic.selectedPeriod.value.name} '
  302 + 'date=${_logic.selectedDate.value}',
  303 + );
284 widget.onQueryChanged( 304 widget.onQueryChanged(
285 _logic.selectedPeriod.value, 305 _logic.selectedPeriod.value,
286 _logic.selectedDate.value, 306 _logic.selectedDate.value,
@@ -288,6 +308,10 @@ class _HrvTrendSectionState extends State<_HrvTrendSection> { @@ -288,6 +308,10 @@ class _HrvTrendSectionState extends State<_HrvTrendSection> {
288 }); 308 });
289 } 309 }
290 310
  311 + void _logHrvTrend(String message) {
  312 + debugPrint('$_hrvTrendLogMarker $message');
  313 + }
  314 +
291 @override 315 @override
292 void dispose() { 316 void dispose() {
293 _periodWorker.dispose(); 317 _periodWorker.dispose();
  1 +import 'package:flutter/foundation.dart';
1 import 'package:get/get.dart'; 2 import 'package:get/get.dart';
  3 +
2 import 'trend_period_controller.dart'; 4 import 'trend_period_controller.dart';
3 5
4 /// HRV 心率变异性 专属 Controller 6 /// HRV 心率变异性 专属 Controller
@@ -11,29 +13,35 @@ class HrvController extends TrendPeriodController { @@ -11,29 +13,35 @@ class HrvController extends TrendPeriodController {
11 13
12 @override 14 @override
13 void loadData() { 15 void loadData() {
  16 + final stopwatch = Stopwatch()..start();
  17 + _log('legacy_load_start period=${currentPeriod.value.name} '
  18 + 'offset=${dateOffset.value}');
14 isLoading.value = true; 19 isLoading.value = true;
15 -  
16 - // 模拟 API 延迟加载  
17 - Future.delayed(const Duration(milliseconds: 300), () {  
18 - final offset = dateOffset.value;  
19 -  
20 - // 依据时间范围偏移动态渲染不同数据,模拟真实 API 拉取效果  
21 - averageHrv.value = '${46 + offset}';  
22 - changeHrv.value = offset >= 0 ? '+3' : '${offset * 2}';  
23 -  
24 - chartData.value = [  
25 - 42.0 + offset,  
26 - 48.0 - offset,  
27 - 55.0 + offset * 2,  
28 - 46.0 - offset,  
29 - 52.0 + offset,  
30 - 58.0 + offset * 3,  
31 - 50.0 - offset * 2,  
32 - ].map((e) => e.clamp(20.0, 80.0)).toList();  
33 -  
34 - chartLabels.value = ['一', '二', '三', '四', '五', '六', '日'];  
35 -  
36 - isLoading.value = false;  
37 - }); 20 +
  21 + final offset = dateOffset.value;
  22 +
  23 + // 依据时间范围偏移动态渲染不同数据,模拟真实 API 拉取效果
  24 + averageHrv.value = '${46 + offset}';
  25 + changeHrv.value = offset >= 0 ? '+3' : '${offset * 2}';
  26 +
  27 + chartData.value = [
  28 + 42.0 + offset,
  29 + 48.0 - offset,
  30 + 55.0 + offset * 2,
  31 + 46.0 - offset,
  32 + 52.0 + offset,
  33 + 58.0 + offset * 3,
  34 + 50.0 - offset * 2,
  35 + ].map((e) => e.clamp(20.0, 80.0)).toList();
  36 +
  37 + chartLabels.value = ['一', '二', '三', '四', '五', '六', '日'];
  38 +
  39 + isLoading.value = false;
  40 + _log('legacy_load_finish period=${currentPeriod.value.name} '
  41 + 'count=${chartData.length} elapsedMs=${stopwatch.elapsedMilliseconds}');
  42 + }
  43 +
  44 + void _log(String message) {
  45 + debugPrint('[OHOS_HRV_TREND_PROFILE] $message');
38 } 46 }
39 } 47 }
@@ -5,6 +5,7 @@ import 'package:doublefeel_flutter/data/datasource/health/health_datasource.dart @@ -5,6 +5,7 @@ import 'package:doublefeel_flutter/data/datasource/health/health_datasource.dart
5 import 'package:doublefeel_flutter/data/datasource/health/health_datasource_wrapper.dart'; 5 import 'package:doublefeel_flutter/data/datasource/health/health_datasource_wrapper.dart';
6 import 'package:doublefeel_flutter/data/datasource/health/health_local_datasource.dart'; 6 import 'package:doublefeel_flutter/data/datasource/health/health_local_datasource.dart';
7 import 'package:doublefeel_flutter/data/datasource/health/health_remote_datasource.dart'; 7 import 'package:doublefeel_flutter/data/datasource/health/health_remote_datasource.dart';
  8 +import 'package:flutter/foundation.dart';
8 import 'package:get/get.dart'; 9 import 'package:get/get.dart';
9 10
10 import '../../report_common/controllers/report_period_logic.dart'; 11 import '../../report_common/controllers/report_period_logic.dart';
@@ -31,6 +32,7 @@ class HrvReportLogic extends ReportPeriodLogic { @@ -31,6 +32,7 @@ class HrvReportLogic extends ReportPeriodLogic {
31 final yearlyReport = Rxn<YearlyHrvReport>(); 32 final yearlyReport = Rxn<YearlyHrvReport>();
32 final HrvReportRepository repository; 33 final HrvReportRepository repository;
33 final _myUserId = Get.find<UserStateService>().userId; 34 final _myUserId = Get.find<UserStateService>().userId;
  35 + static const _logMarker = '[OHOS_HRV_TREND_PROFILE]';
34 bool get isMySelf => 36 bool get isMySelf =>
35 targetUserId.value == null || _myUserId == targetUserId.value; 37 targetUserId.value == null || _myUserId == targetUserId.value;
36 38
@@ -49,27 +51,53 @@ class HrvReportLogic extends ReportPeriodLogic { @@ -49,27 +51,53 @@ class HrvReportLogic extends ReportPeriodLogic {
49 51
50 @override 52 @override
51 Future<void> loadReport() async { 53 Future<void> loadReport() async {
  54 + final stopwatch = Stopwatch()..start();
  55 + final period = selectedPeriod.value;
  56 + final date = selectedDate.value;
  57 + _log(
  58 + 'logic_load_start period=${period.name} date=$date '
  59 + 'targetUserId=${targetUserId.value} isMySelf=$isMySelf',
  60 + );
52 isLoading.value = !isMySelf; 61 isLoading.value = !isMySelf;
53 62
54 try { 63 try {
55 - if (selectedPeriod.value == ReportPeriod.year) { 64 + if (period == ReportPeriod.year) {
56 yearlyReport.value = await repository.getYearlyReport( 65 yearlyReport.value = await repository.getYearlyReport(
57 - selectedDate.value.year, 66 + date.year,
58 targetUserId: targetUserId.value, 67 targetUserId: targetUserId.value,
59 ); 68 );
60 - } else if (selectedPeriod.value == ReportPeriod.month) { 69 + _log(
  70 + 'logic_assign_finish period=${period.name} '
  71 + 'days=${yearlyReport.value?.days.length ?? 0} '
  72 + 'elapsedMs=${stopwatch.elapsedMilliseconds}',
  73 + );
  74 + } else if (period == ReportPeriod.month) {
61 monthlyReport.value = await repository.getMonthlyReport( 75 monthlyReport.value = await repository.getMonthlyReport(
62 monthStart, 76 monthStart,
63 targetUserId: targetUserId.value, 77 targetUserId: targetUserId.value,
64 ); 78 );
  79 + _log(
  80 + 'logic_assign_finish period=${period.name} '
  81 + 'days=${monthlyReport.value?.days.length ?? 0} '
  82 + 'elapsedMs=${stopwatch.elapsedMilliseconds}',
  83 + );
65 } else { 84 } else {
66 weeklyReport.value = await repository.getWeeklyReport( 85 weeklyReport.value = await repository.getWeeklyReport(
67 weekStart, 86 weekStart,
68 targetUserId: targetUserId.value, 87 targetUserId: targetUserId.value,
69 ); 88 );
  89 + _log(
  90 + 'logic_assign_finish period=${period.name} '
  91 + 'days=${weeklyReport.value?.days.length ?? 0} '
  92 + 'elapsedMs=${stopwatch.elapsedMilliseconds}',
  93 + );
70 } 94 }
71 } finally { 95 } finally {
72 isLoading.value = false; 96 isLoading.value = false;
  97 + _log(
  98 + 'logic_load_finish period=$period date=$date '
  99 + 'elapsedMs=${stopwatch.elapsedMilliseconds}',
  100 + );
73 } 101 }
74 } 102 }
75 103
@@ -78,4 +106,8 @@ class HrvReportLogic extends ReportPeriodLogic { @@ -78,4 +106,8 @@ class HrvReportLogic extends ReportPeriodLogic {
78 targetUserId.value = userId; 106 targetUserId.value = userId;
79 return loadReport(); 107 return loadReport();
80 } 108 }
  109 +
  110 + void _log(String message) {
  111 + debugPrint('$_logMarker $message');
  112 + }
81 } 113 }
1 import 'package:doublefeel_flutter/core/result/app_result.dart'; 1 import 'package:doublefeel_flutter/core/result/app_result.dart';
2 import 'package:doublefeel_flutter/data/datasource/health/health_datasource.dart'; 2 import 'package:doublefeel_flutter/data/datasource/health/health_datasource.dart';
3 import 'package:doublefeel_flutter/data/models/health/hrv/hrv_statistics_data.dart'; 3 import 'package:doublefeel_flutter/data/models/health/hrv/hrv_statistics_data.dart';
  4 +import 'package:flutter/foundation.dart';
4 5
5 import '../models/hrv_report_models.dart'; 6 import '../models/hrv_report_models.dart';
6 7
@@ -27,6 +28,7 @@ class ApiHrvReportDataSource implements HrvReportDataSource { @@ -27,6 +28,7 @@ class ApiHrvReportDataSource implements HrvReportDataSource {
27 static const _weekDateRangeType = 0; 28 static const _weekDateRangeType = 0;
28 static const _monthDateRangeType = 1; 29 static const _monthDateRangeType = 1;
29 static const _yearDateRangeType = 2; 30 static const _yearDateRangeType = 2;
  31 + static const _logMarker = '[OHOS_HRV_TREND_PROFILE]';
30 32
31 final HealthDataSource _healthDataSource; 33 final HealthDataSource _healthDataSource;
32 34
@@ -36,15 +38,27 @@ class ApiHrvReportDataSource implements HrvReportDataSource { @@ -36,15 +38,27 @@ class ApiHrvReportDataSource implements HrvReportDataSource {
36 int? targetUserId, 38 int? targetUserId,
37 }) async { 39 }) async {
38 final start = DateTime(weekStart.year, weekStart.month, weekStart.day); 40 final start = DateTime(weekStart.year, weekStart.month, weekStart.day);
  41 + final stopwatch = Stopwatch()..start();
  42 + _log(
  43 + 'datasource_week_start weekStart=$start '
  44 + 'targetUserId=$targetUserId',
  45 + );
39 final result = await _healthDataSource.getHrvStatistics( 46 final result = await _healthDataSource.getHrvStatistics(
40 _weekDateRangeType, 47 _weekDateRangeType,
41 _dateKey(start), 48 _dateKey(start),
42 queryUserId: targetUserId, 49 queryUserId: targetUserId,
43 ); 50 );
44 - return switch (result) { 51 + final fetchElapsedMs = stopwatch.elapsedMilliseconds;
  52 + final report = switch (result) {
45 AppSuccess(:final data) => _weeklyReportFromStatistics(start, data), 53 AppSuccess(:final data) => _weeklyReportFromStatistics(start, data),
46 AppFailure() => WeeklyHrvReport.empty(start), 54 AppFailure() => WeeklyHrvReport.empty(start),
47 }; 55 };
  56 + _log(
  57 + 'datasource_week_finish success=${result is AppSuccess} '
  58 + 'days=${report.days.length} fetchElapsedMs=$fetchElapsedMs '
  59 + 'elapsedMs=${stopwatch.elapsedMilliseconds}',
  60 + );
  61 + return report;
48 } 62 }
49 63
50 @override 64 @override
@@ -53,15 +67,27 @@ class ApiHrvReportDataSource implements HrvReportDataSource { @@ -53,15 +67,27 @@ class ApiHrvReportDataSource implements HrvReportDataSource {
53 int? targetUserId, 67 int? targetUserId,
54 }) async { 68 }) async {
55 final start = DateTime(monthStart.year, monthStart.month); 69 final start = DateTime(monthStart.year, monthStart.month);
  70 + final stopwatch = Stopwatch()..start();
  71 + _log(
  72 + 'datasource_month_start monthStart=$start '
  73 + 'targetUserId=$targetUserId',
  74 + );
56 final result = await _healthDataSource.getHrvStatistics( 75 final result = await _healthDataSource.getHrvStatistics(
57 _monthDateRangeType, 76 _monthDateRangeType,
58 _dateKey(start), 77 _dateKey(start),
59 queryUserId: targetUserId, 78 queryUserId: targetUserId,
60 ); 79 );
61 - return switch (result) { 80 + final fetchElapsedMs = stopwatch.elapsedMilliseconds;
  81 + final report = switch (result) {
62 AppSuccess(:final data) => _monthlyReportFromStatistics(start, data), 82 AppSuccess(:final data) => _monthlyReportFromStatistics(start, data),
63 AppFailure() => MonthlyHrvReport.empty(start), 83 AppFailure() => MonthlyHrvReport.empty(start),
64 }; 84 };
  85 + _log(
  86 + 'datasource_month_finish success=${result is AppSuccess} '
  87 + 'days=${report.days.length} fetchElapsedMs=$fetchElapsedMs '
  88 + 'elapsedMs=${stopwatch.elapsedMilliseconds}',
  89 + );
  90 + return report;
65 } 91 }
66 92
67 @override 93 @override
@@ -70,15 +96,28 @@ class ApiHrvReportDataSource implements HrvReportDataSource { @@ -70,15 +96,28 @@ class ApiHrvReportDataSource implements HrvReportDataSource {
70 int? targetUserId, 96 int? targetUserId,
71 }) async { 97 }) async {
72 final start = DateTime(year); 98 final start = DateTime(year);
  99 + final stopwatch = Stopwatch()..start();
  100 + _log('datasource_year_start year=$year targetUserId=$targetUserId');
73 final result = await _healthDataSource.getHrvStatistics( 101 final result = await _healthDataSource.getHrvStatistics(
74 _yearDateRangeType, 102 _yearDateRangeType,
75 _dateKey(start), 103 _dateKey(start),
76 queryUserId: targetUserId, 104 queryUserId: targetUserId,
77 ); 105 );
78 - return switch (result) { 106 + final fetchElapsedMs = stopwatch.elapsedMilliseconds;
  107 + final report = switch (result) {
79 AppSuccess(:final data) => _yearlyReportFromStatistics(year, data), 108 AppSuccess(:final data) => _yearlyReportFromStatistics(year, data),
80 AppFailure() => YearlyHrvReport.empty(year), 109 AppFailure() => YearlyHrvReport.empty(year),
81 }; 110 };
  111 + _log(
  112 + 'datasource_year_finish success=${result is AppSuccess} '
  113 + 'days=${report.days.length} fetchElapsedMs=$fetchElapsedMs '
  114 + 'elapsedMs=${stopwatch.elapsedMilliseconds}',
  115 + );
  116 + return report;
  117 + }
  118 +
  119 + static void _log(String message) {
  120 + debugPrint('$_logMarker $message');
82 } 121 }
83 122
84 WeeklyHrvReport _weeklyReportFromStatistics( 123 WeeklyHrvReport _weeklyReportFromStatistics(
  1 +import 'package:flutter/foundation.dart';
  2 +
1 import '../models/hrv_report_models.dart'; 3 import '../models/hrv_report_models.dart';
2 import 'hrv_report_datasource.dart'; 4 import 'hrv_report_datasource.dart';
3 5
@@ -22,34 +24,67 @@ class HrvReportRepositoryImpl implements HrvReportRepository { @@ -22,34 +24,67 @@ class HrvReportRepositoryImpl implements HrvReportRepository {
22 const HrvReportRepositoryImpl({required this.dataSource}); 24 const HrvReportRepositoryImpl({required this.dataSource});
23 25
24 final HrvReportDataSource dataSource; 26 final HrvReportDataSource dataSource;
  27 + static const _logMarker = '[OHOS_HRV_TREND_PROFILE]';
25 28
26 @override 29 @override
27 Future<WeeklyHrvReport> getWeeklyReport( 30 Future<WeeklyHrvReport> getWeeklyReport(
28 DateTime weekStart, { 31 DateTime weekStart, {
29 int? targetUserId, 32 int? targetUserId,
30 - }) {  
31 - return dataSource.fetchWeeklyReport( 33 + }) async {
  34 + final stopwatch = Stopwatch()..start();
  35 + _log(
  36 + 'repository_week_start weekStart=$weekStart targetUserId=$targetUserId');
  37 + final report = await dataSource.fetchWeeklyReport(
32 weekStart, 38 weekStart,
33 targetUserId: targetUserId, 39 targetUserId: targetUserId,
34 ); 40 );
  41 + _log(
  42 + 'repository_week_finish days=${report.days.length} '
  43 + 'elapsedMs=${stopwatch.elapsedMilliseconds}',
  44 + );
  45 + return report;
35 } 46 }
36 47
37 @override 48 @override
38 Future<MonthlyHrvReport> getMonthlyReport( 49 Future<MonthlyHrvReport> getMonthlyReport(
39 DateTime monthStart, { 50 DateTime monthStart, {
40 int? targetUserId, 51 int? targetUserId,
41 - }) {  
42 - return dataSource.fetchMonthlyReport( 52 + }) async {
  53 + final stopwatch = Stopwatch()..start();
  54 + _log(
  55 + 'repository_month_start monthStart=$monthStart '
  56 + 'targetUserId=$targetUserId',
  57 + );
  58 + final report = await dataSource.fetchMonthlyReport(
43 monthStart, 59 monthStart,
44 targetUserId: targetUserId, 60 targetUserId: targetUserId,
45 ); 61 );
  62 + _log(
  63 + 'repository_month_finish days=${report.days.length} '
  64 + 'elapsedMs=${stopwatch.elapsedMilliseconds}',
  65 + );
  66 + return report;
46 } 67 }
47 68
48 @override 69 @override
49 Future<YearlyHrvReport> getYearlyReport( 70 Future<YearlyHrvReport> getYearlyReport(
50 int year, { 71 int year, {
51 int? targetUserId, 72 int? targetUserId,
52 - }) {  
53 - return dataSource.fetchYearlyReport(year, targetUserId: targetUserId); 73 + }) async {
  74 + final stopwatch = Stopwatch()..start();
  75 + _log('repository_year_start year=$year targetUserId=$targetUserId');
  76 + final report = await dataSource.fetchYearlyReport(
  77 + year,
  78 + targetUserId: targetUserId,
  79 + );
  80 + _log(
  81 + 'repository_year_finish days=${report.days.length} '
  82 + 'elapsedMs=${stopwatch.elapsedMilliseconds}',
  83 + );
  84 + return report;
  85 + }
  86 +
  87 + static void _log(String message) {
  88 + debugPrint('$_logMarker $message');
54 } 89 }
55 } 90 }
@@ -217,6 +217,11 @@ class _HrvPeriodBar extends StatelessWidget { @@ -217,6 +217,11 @@ class _HrvPeriodBar extends StatelessWidget {
217 child: GestureDetector( 217 child: GestureDetector(
218 behavior: HitTestBehavior.opaque, 218 behavior: HitTestBehavior.opaque,
219 onTap: () { 219 onTap: () {
  220 + debugPrint(
  221 + '[OHOS_HRV_TREND_PROFILE] period_tab_tap '
  222 + 'from=${selectedPeriod.name} to=${period.name} '
  223 + 'locked=${lockedPeriods.contains(period)}',
  224 + );
220 if (lockedPeriods.contains(period)) { 225 if (lockedPeriods.contains(period)) {
221 onLockedPeriodTap(period); 226 onLockedPeriodTap(period);
222 } else { 227 } else {
@@ -140,17 +140,31 @@ abstract class ReportPeriodLogic { @@ -140,17 +140,31 @@ abstract class ReportPeriodLogic {
140 Future<void> selectPeriod( 140 Future<void> selectPeriod(
141 ReportPeriod period, { 141 ReportPeriod period, {
142 bool? forceRefresh, 142 bool? forceRefresh,
143 - }) { 143 + }) async {
  144 + final stopwatch = Stopwatch()..start();
144 final nextPeriod = normalizePeriod(period); 145 final nextPeriod = normalizePeriod(period);
145 final shouldRefresh = forceRefresh ?? this.forceRefresh; 146 final shouldRefresh = forceRefresh ?? this.forceRefresh;
  147 + _logTrendProfile(
  148 + 'selectPeriod_start from=${selectedPeriod.value.name} '
  149 + 'to=${nextPeriod.name} selectedDate=${selectedDate.value} '
  150 + 'forceRefresh=$shouldRefresh',
  151 + );
146 if (!shouldRefresh && selectedPeriod.value == nextPeriod) { 152 if (!shouldRefresh && selectedPeriod.value == nextPeriod) {
147 - return Future.value(); 153 + _logTrendProfile(
  154 + 'selectPeriod_skip_same period=${nextPeriod.name} '
  155 + 'elapsedMs=${stopwatch.elapsedMilliseconds}',
  156 + );
  157 + return;
148 } 158 }
149 final nextDate = _dateForPeriodTransition(nextPeriod); 159 final nextDate = _dateForPeriodTransition(nextPeriod);
150 selectedPeriod.value = nextPeriod; 160 selectedPeriod.value = nextPeriod;
151 selectedDate.value = nextDate; 161 selectedDate.value = nextDate;
152 _setAnchorFor(nextPeriod, nextDate); 162 _setAnchorFor(nextPeriod, nextDate);
153 - return loadReport(); 163 + await loadReport();
  164 + _logTrendProfile(
  165 + 'selectPeriod_finish period=${nextPeriod.name} nextDate=$nextDate '
  166 + 'elapsedMs=${stopwatch.elapsedMilliseconds}',
  167 + );
154 } 168 }
155 169
156 Future<void> selectDate( 170 Future<void> selectDate(
@@ -327,5 +341,8 @@ abstract class ReportPeriodLogic { @@ -327,5 +341,8 @@ abstract class ReportPeriodLogic {
327 final normalized = DateTime(date.year, date.month, date.day); 341 final normalized = DateTime(date.year, date.month, date.day);
328 return normalized.subtract(Duration(days: normalized.weekday - 1)); 342 return normalized.subtract(Duration(days: normalized.weekday - 1));
329 } 343 }
  344 +}
330 345
  346 +void _logTrendProfile(String message) {
  347 + debugPrint('[OHOS_HRV_TREND_PROFILE] $message');
331 } 348 }
@@ -179,6 +179,19 @@ class OhosHealthRawDataSource implements HealthRawDataSource { @@ -179,6 +179,19 @@ class OhosHealthRawDataSource implements HealthRawDataSource {
179 ); 179 );
180 } 180 }
181 181
  182 + Future<OhosHealthRawDataCalculationSyncSnapshot>
  183 + syncCalculationRawDataSnapshot({
  184 + int? startTime,
  185 + int? endTime,
  186 + List<int>? dataTypes,
  187 + }) {
  188 + return _syncService.syncCalculationRawDataSnapshot(
  189 + startTime: startTime,
  190 + endTime: endTime,
  191 + dataTypes: dataTypes,
  192 + );
  193 + }
  194 +
182 Future<OhosHealthRawDataSyncResult> syncRawData({ 195 Future<OhosHealthRawDataSyncResult> syncRawData({
183 required int dataType, 196 required int dataType,
184 int? startTime, 197 int? startTime,
@@ -237,6 +250,26 @@ class OhosHealthRawDataSource implements HealthRawDataSource { @@ -237,6 +250,26 @@ class OhosHealthRawDataSource implements HealthRawDataSource {
237 .toList(growable: false); 250 .toList(growable: false);
238 } 251 }
239 252
  253 + List<HealthKitRawDataPoint> getRawDataFromSnapshot({
  254 + required OhosHealthRawDataMemorySnapshot snapshot,
  255 + required int dataType,
  256 + required int startTime,
  257 + required int endTime,
  258 + }) {
  259 + return snapshot
  260 + .query(dataType: dataType, startTime: startTime, endTime: endTime)
  261 + .map(
  262 + (item) => HealthKitRawDataPoint(
  263 + dataType: dataType,
  264 + startTime: item.dataTime,
  265 + endTime: item.dataTime,
  266 + value: _doublePayload(item.payload, 'value'),
  267 + isMotionLike: _boolPayload(item.payload, 'is_motion_like'),
  268 + ),
  269 + )
  270 + .toList(growable: false);
  271 + }
  272 +
240 @override 273 @override
241 Future<List<HealthKitRawSleepDataPoint>> getRawSleepData( 274 Future<List<HealthKitRawSleepDataPoint>> getRawSleepData(
242 int startTime, 275 int startTime,
@@ -262,6 +295,21 @@ class OhosHealthRawDataSource implements HealthRawDataSource { @@ -262,6 +295,21 @@ class OhosHealthRawDataSource implements HealthRawDataSource {
262 ]; 295 ];
263 } 296 }
264 297
  298 + List<HealthKitRawDataPoint> getRawSleepIntervalsFromSnapshot({
  299 + required OhosHealthRawDataMemorySnapshot snapshot,
  300 + required int startTime,
  301 + required int endTime,
  302 + }) {
  303 + return snapshot
  304 + .query(
  305 + dataType: OhosHealthRawDataType.sleepAnalysis,
  306 + startTime: startTime,
  307 + endTime: endTime,
  308 + )
  309 + .map(_sleepPointFromItem)
  310 + .toList(growable: false);
  311 + }
  312 +
265 @override 313 @override
266 Future<List<HealthKitRawActivityDataPoint>> getRawActivityData( 314 Future<List<HealthKitRawActivityDataPoint>> getRawActivityData(
267 int startTime, 315 int startTime,
@@ -342,6 +390,21 @@ class OhosHealthRawDataSource implements HealthRawDataSource { @@ -342,6 +390,21 @@ class OhosHealthRawDataSource implements HealthRawDataSource {
342 return items.map(_workoutPointFromItem).toList(growable: false); 390 return items.map(_workoutPointFromItem).toList(growable: false);
343 } 391 }
344 392
  393 + List<HealthKitRawWorkoutDataPoint> getRawWorkoutDataFromSnapshot({
  394 + required OhosHealthRawDataMemorySnapshot snapshot,
  395 + required int startTime,
  396 + required int endTime,
  397 + }) {
  398 + return snapshot
  399 + .query(
  400 + dataType: OhosHealthRawDataType.workout,
  401 + startTime: startTime,
  402 + endTime: endTime,
  403 + )
  404 + .map(_workoutPointFromItem)
  405 + .toList(growable: false);
  406 + }
  407 +
345 HealthKitRawDataPoint _sleepPointFromItem(OhosHealthRawDataItem item) { 408 HealthKitRawDataPoint _sleepPointFromItem(OhosHealthRawDataItem item) {
346 return HealthKitRawDataPoint( 409 return HealthKitRawDataPoint(
347 dataType: item.dataType, 410 dataType: item.dataType,
@@ -2084,6 +2084,7 @@ class HealthRawStressLocalStore { @@ -2084,6 +2084,7 @@ class HealthRawStressLocalStore {
2084 static const realtimeStressResultsTable = 'realtime_stress_results'; 2084 static const realtimeStressResultsTable = 'realtime_stress_results';
2085 static const dailyStressResultsTable = 'daily_stress_results'; 2085 static const dailyStressResultsTable = 'daily_stress_results';
2086 static const sleepResultsTable = 'sleep_results'; 2086 static const sleepResultsTable = 'sleep_results';
  2087 + static const hrvTrendLogMarker = '[OHOS_HRV_TREND_PROFILE]';
2087 2088
2088 final Directory? _rootDirectory; 2089 final Directory? _rootDirectory;
2089 final DatabaseFactory? _databaseFactory; 2090 final DatabaseFactory? _databaseFactory;
@@ -2217,6 +2218,7 @@ class HealthRawStressLocalStore { @@ -2217,6 +2218,7 @@ class HealthRawStressLocalStore {
2217 required int startTime, 2218 required int startTime,
2218 required int endTime, 2219 required int endTime,
2219 }) async { 2220 }) async {
  2221 + final stopwatch = Stopwatch()..start();
2220 final db = await _database(userId); 2222 final db = await _database(userId);
2221 final rows = await db.query( 2223 final rows = await db.query(
2222 hrvResultsTable, 2224 hrvResultsTable,
@@ -2224,7 +2226,13 @@ class HealthRawStressLocalStore { @@ -2224,7 +2226,13 @@ class HealthRawStressLocalStore {
2224 whereArgs: [startTime, endTime], 2226 whereArgs: [startTime, endTime],
2225 orderBy: 'raw_end_time ASC', 2227 orderBy: 'raw_end_time ASC',
2226 ); 2228 );
2227 - return rows.map(HealthRawHrvStressPoint.fromDb).toList(); 2229 + final points = rows.map(HealthRawHrvStressPoint.fromDb).toList();
  2230 + _logHrvTrend(
  2231 + 'result_db_query_hrv_finish userId=$userId '
  2232 + 'startTime=$startTime endTime=$endTime rows=${rows.length} '
  2233 + 'elapsedMs=${stopwatch.elapsedMilliseconds}',
  2234 + );
  2235 + return points;
2228 } 2236 }
2229 2237
2230 Future<List<HealthRawHrvStressPoint>> queryPendingHrvStressPoints({ 2238 Future<List<HealthRawHrvStressPoint>> queryPendingHrvStressPoints({
@@ -2275,6 +2283,7 @@ class HealthRawStressLocalStore { @@ -2275,6 +2283,7 @@ class HealthRawStressLocalStore {
2275 required int startDate, 2283 required int startDate,
2276 required int endDate, 2284 required int endDate,
2277 }) async { 2285 }) async {
  2286 + final stopwatch = Stopwatch()..start();
2278 final db = await _database(userId); 2287 final db = await _database(userId);
2279 final rows = await db.query( 2288 final rows = await db.query(
2280 dailyStressResultsTable, 2289 dailyStressResultsTable,
@@ -2282,7 +2291,13 @@ class HealthRawStressLocalStore { @@ -2282,7 +2291,13 @@ class HealthRawStressLocalStore {
2282 whereArgs: [startDate, endDate], 2291 whereArgs: [startDate, endDate],
2283 orderBy: 'date ASC', 2292 orderBy: 'date ASC',
2284 ); 2293 );
2285 - return rows.map(HealthRawDailyStressPoint.fromDb).toList(); 2294 + final points = rows.map(HealthRawDailyStressPoint.fromDb).toList();
  2295 + _logHrvTrend(
  2296 + 'result_db_query_daily_stress_finish userId=$userId '
  2297 + 'startDate=$startDate endDate=$endDate rows=${rows.length} '
  2298 + 'elapsedMs=${stopwatch.elapsedMilliseconds}',
  2299 + );
  2300 + return points;
2286 } 2301 }
2287 2302
2288 Future<List<HealthRawDailyStressPoint>> queryPendingDailyStressPoints({ 2303 Future<List<HealthRawDailyStressPoint>> queryPendingDailyStressPoints({
@@ -3250,6 +3265,16 @@ CREATE TABLE IF NOT EXISTS $sleepResultsTable ( @@ -3250,6 +3265,16 @@ CREATE TABLE IF NOT EXISTS $sleepResultsTable (
3250 message.contains('code 2067'); 3265 message.contains('code 2067');
3251 } 3266 }
3252 3267
  3268 + void _logHrvTrend(String message) {
  3269 + final taggedMessage = '$hrvTrendLogMarker $message';
  3270 + debugPrint(taggedMessage);
  3271 + try {
  3272 + AppLogger.i(taggedMessage);
  3273 + } catch (_) {
  3274 + // AppLogger may not be initialized in isolated test/bootstrap contexts.
  3275 + }
  3276 + }
  3277 +
3253 int _currentUnixSeconds() { 3278 int _currentUnixSeconds() {
3254 return DateTime.now().millisecondsSinceEpoch ~/ 1000; 3279 return DateTime.now().millisecondsSinceEpoch ~/ 1000;
3255 } 3280 }
@@ -33,6 +33,8 @@ class OHOSHealthRawDataCoreService { @@ -33,6 +33,8 @@ class OHOSHealthRawDataCoreService {
33 static const String _dailyStressLogMarker = '[OHOS_DAILY_STRESS_CALC]'; 33 static const String _dailyStressLogMarker = '[OHOS_DAILY_STRESS_CALC]';
34 static const String _sleepCalcLogMarker = '[OHOS_SLEEP_CALC]'; 34 static const String _sleepCalcLogMarker = '[OHOS_SLEEP_CALC]';
35 static const String _profileLogMarker = '[OHOS_HEALTH_RAW_PROFILE]'; 35 static const String _profileLogMarker = '[OHOS_HEALTH_RAW_PROFILE]';
  36 + static const String _timingLogMarker = '[OHOS_HEALTH_TIMING]';
  37 + static const String _hrvTrendLogMarker = '[OHOS_HRV_TREND_PROFILE]';
36 38
37 OHOSHealthRawDataCoreService({ 39 OHOSHealthRawDataCoreService({
38 HealthRawDataSource? rawDataSource, 40 HealthRawDataSource? rawDataSource,
@@ -261,15 +263,22 @@ class OHOSHealthRawDataCoreService { @@ -261,15 +263,22 @@ class OHOSHealthRawDataCoreService {
261 final willSyncRawData = 263 final willSyncRawData =
262 hasAuthorization && _rawDataSource is OhosHealthRawDataSource; 264 hasAuthorization && _rawDataSource is OhosHealthRawDataSource;
263 final syncStartTime = willSyncRawData ? DateTime.now() : null; 265 final syncStartTime = willSyncRawData ? DateTime.now() : null;
264 - final syncResults = await _syncCalculationRawDataSafely( 266 + final syncSnapshot = await _syncCalculationRawDataSafely(
265 hasAuthorization: hasAuthorization, 267 hasAuthorization: hasAuthorization,
266 startTime: forceStartTime, 268 startTime: forceStartTime,
267 endTime: effectiveEndTime, 269 endTime: effectiveEndTime,
268 ); 270 );
  271 + final syncResults =
  272 + syncSnapshot?.results ?? const <OhosHealthRawDataSyncResult>[];
269 final syncElapsed = syncStartTime == null 273 final syncElapsed = syncStartTime == null
270 ? Duration.zero 274 ? Duration.zero
271 : DateTime.now().difference(syncStartTime); 275 : DateTime.now().difference(syncStartTime);
272 - final syncedRawStartTime = _earliestStoredTime(syncResults); 276 + _logInfo(
  277 + '$_timingLogMarker fetch_all_finish userId=$userId '
  278 + 'elapsedMs=${syncElapsed.inMilliseconds}',
  279 + );
  280 + final syncedRawStartTime = syncSnapshot?.rawData.earliestTime() ??
  281 + _earliestStoredTime(syncResults);
273 _logInfo( 282 _logInfo(
274 'calculate_sync_finish startTime=$requestedStartTime ' 283 'calculate_sync_finish startTime=$requestedStartTime '
275 'endTime=$effectiveEndTime syncedRawStartTime=$syncedRawStartTime ' 284 'endTime=$effectiveEndTime syncedRawStartTime=$syncedRawStartTime '
@@ -298,6 +307,7 @@ class OHOSHealthRawDataCoreService { @@ -298,6 +307,7 @@ class OHOSHealthRawDataCoreService {
298 effectiveEndTime: effectiveEndTime, 307 effectiveEndTime: effectiveEndTime,
299 earliestStartTime: earliestStartTime, 308 earliestStartTime: earliestStartTime,
300 syncedRawStartTime: syncedRawStartTime, 309 syncedRawStartTime: syncedRawStartTime,
  310 + rawDataSnapshot: syncSnapshot?.rawData,
301 readChunkDays: readChunkDays, 311 readChunkDays: readChunkDays,
302 ); 312 );
303 } catch (error) { 313 } catch (error) {
@@ -323,6 +333,10 @@ class OHOSHealthRawDataCoreService { @@ -323,6 +333,10 @@ class OHOSHealthRawDataCoreService {
323 'sleep=${storedResult.result.sleepResults.length} ' 333 'sleep=${storedResult.result.sleepResults.length} '
324 'elapsedMs=${calculationElapsed.inMilliseconds}', 334 'elapsedMs=${calculationElapsed.inMilliseconds}',
325 ); 335 );
  336 + _logInfo(
  337 + '$_timingLogMarker calculate_finish userId=$userId '
  338 + 'elapsedMs=${calculationElapsed.inMilliseconds}',
  339 + );
326 final uploadScheduleStopwatch = Stopwatch()..start(); 340 final uploadScheduleStopwatch = Stopwatch()..start();
327 _scheduleResultUpload(); 341 _scheduleResultUpload();
328 _profileLog( 342 _profileLog(
@@ -339,7 +353,7 @@ class OHOSHealthRawDataCoreService { @@ -339,7 +353,7 @@ class OHOSHealthRawDataCoreService {
339 'core_localNotification_finish userId=$userId ' 353 'core_localNotification_finish userId=$userId '
340 'elapsedMs=${notificationStopwatch.elapsedMilliseconds}', 354 'elapsedMs=${notificationStopwatch.elapsedMilliseconds}',
341 ); 355 );
342 - if (_hasStoredRawData(syncResults) || 356 + if (_hasFetchedRawData(syncResults) ||
343 _hasCalculatedResult(storedResult.result)) { 357 _hasCalculatedResult(storedResult.result)) {
344 _showDebugTimingToast( 358 _showDebugTimingToast(
345 syncElapsed: syncElapsed, 359 syncElapsed: syncElapsed,
@@ -372,6 +386,7 @@ class OHOSHealthRawDataCoreService { @@ -372,6 +386,7 @@ class OHOSHealthRawDataCoreService {
372 required int effectiveEndTime, 386 required int effectiveEndTime,
373 required int earliestStartTime, 387 required int earliestStartTime,
374 required int? syncedRawStartTime, 388 required int? syncedRawStartTime,
  389 + required OhosHealthRawDataMemorySnapshot? rawDataSnapshot,
375 required int readChunkDays, 390 required int readChunkDays,
376 }) async { 391 }) async {
377 final totalStopwatch = Stopwatch()..start(); 392 final totalStopwatch = Stopwatch()..start();
@@ -486,10 +501,11 @@ class OHOSHealthRawDataCoreService { @@ -486,10 +501,11 @@ class OHOSHealthRawDataCoreService {
486 ); 501 );
487 502
488 final hrvFetchStopwatch = Stopwatch()..start(); 503 final hrvFetchStopwatch = Stopwatch()..start();
489 - final hrvPoints = await _fetchRawDataInChunks( 504 + final hrvPoints = await _fetchRawDataForCalculation(
490 HealthDataUploadType.hrv.type, 505 HealthDataUploadType.hrv.type,
491 hrvStartTime, 506 hrvStartTime,
492 effectiveEndTime, 507 effectiveEndTime,
  508 + rawDataSnapshot: rawDataSnapshot,
493 readChunkDays: readChunkDays, 509 readChunkDays: readChunkDays,
494 ); 510 );
495 _profileLog( 511 _profileLog(
@@ -500,10 +516,11 @@ class OHOSHealthRawDataCoreService { @@ -500,10 +516,11 @@ class OHOSHealthRawDataCoreService {
500 'elapsedMs=${hrvFetchStopwatch.elapsedMilliseconds}', 516 'elapsedMs=${hrvFetchStopwatch.elapsedMilliseconds}',
501 ); 517 );
502 final heartRateFetchStopwatch = Stopwatch()..start(); 518 final heartRateFetchStopwatch = Stopwatch()..start();
503 - final heartRatePoints = await _fetchRawDataInChunks( 519 + final heartRatePoints = await _fetchRawDataForCalculation(
504 HealthDataUploadType.heartRate.type, 520 HealthDataUploadType.heartRate.type,
505 heartRateStartTime, 521 heartRateStartTime,
506 effectiveEndTime, 522 effectiveEndTime,
  523 + rawDataSnapshot: rawDataSnapshot,
507 readChunkDays: readChunkDays, 524 readChunkDays: readChunkDays,
508 ); 525 );
509 _profileLog( 526 _profileLog(
@@ -514,10 +531,11 @@ class OHOSHealthRawDataCoreService { @@ -514,10 +531,11 @@ class OHOSHealthRawDataCoreService {
514 'elapsedMs=${heartRateFetchStopwatch.elapsedMilliseconds}', 531 'elapsedMs=${heartRateFetchStopwatch.elapsedMilliseconds}',
515 ); 532 );
516 final restingHeartRateFetchStopwatch = Stopwatch()..start(); 533 final restingHeartRateFetchStopwatch = Stopwatch()..start();
517 - final restingHeartRatePoints = await _fetchRawDataInChunks( 534 + final restingHeartRatePoints = await _fetchRawDataForCalculation(
518 HealthDataUploadType.restingHeartRate.type, 535 HealthDataUploadType.restingHeartRate.type,
519 heartRateStartTime, 536 heartRateStartTime,
520 effectiveEndTime, 537 effectiveEndTime,
  538 + rawDataSnapshot: rawDataSnapshot,
521 readChunkDays: readChunkDays, 539 readChunkDays: readChunkDays,
522 ); 540 );
523 _profileLog( 541 _profileLog(
@@ -529,9 +547,10 @@ class OHOSHealthRawDataCoreService { @@ -529,9 +547,10 @@ class OHOSHealthRawDataCoreService {
529 'elapsedMs=${restingHeartRateFetchStopwatch.elapsedMilliseconds}', 547 'elapsedMs=${restingHeartRateFetchStopwatch.elapsedMilliseconds}',
530 ); 548 );
531 final sleepFetchStopwatch = Stopwatch()..start(); 549 final sleepFetchStopwatch = Stopwatch()..start();
532 - final sleepIntervals = await _fetchSleepIntervalsInChunks( 550 + final sleepIntervals = await _fetchSleepIntervalsForCalculation(
533 sleepStartTime, 551 sleepStartTime,
534 effectiveEndTime, 552 effectiveEndTime,
  553 + rawDataSnapshot: rawDataSnapshot,
535 readChunkDays: readChunkDays, 554 readChunkDays: readChunkDays,
536 ); 555 );
537 _profileLog( 556 _profileLog(
@@ -541,9 +560,10 @@ class OHOSHealthRawDataCoreService { @@ -541,9 +560,10 @@ class OHOSHealthRawDataCoreService {
541 'elapsedMs=${sleepFetchStopwatch.elapsedMilliseconds}', 560 'elapsedMs=${sleepFetchStopwatch.elapsedMilliseconds}',
542 ); 561 );
543 final workoutFetchStopwatch = Stopwatch()..start(); 562 final workoutFetchStopwatch = Stopwatch()..start();
544 - final workoutIntervals = await _fetchWorkoutIntervalsInChunks( 563 + final workoutIntervals = await _fetchWorkoutIntervalsForCalculation(
545 heartRateStartTime, 564 heartRateStartTime,
546 effectiveEndTime, 565 effectiveEndTime,
  566 + rawDataSnapshot: rawDataSnapshot,
547 readChunkDays: readChunkDays, 567 readChunkDays: readChunkDays,
548 ); 568 );
549 _profileLog( 569 _profileLog(
@@ -808,12 +828,19 @@ class OHOSHealthRawDataCoreService { @@ -808,12 +828,19 @@ class OHOSHealthRawDataCoreService {
808 Future<List<HealthRawHrvStressPoint>> queryHrvStressPoints({ 828 Future<List<HealthRawHrvStressPoint>> queryHrvStressPoints({
809 required int startTime, 829 required int startTime,
810 required int endTime, 830 required int endTime,
811 - }) {  
812 - return _localStore.queryHrvStressPoints( 831 + }) async {
  832 + final stopwatch = Stopwatch()..start();
  833 + final points = await _localStore.queryHrvStressPoints(
813 userId: _userId, 834 userId: _userId,
814 startTime: startTime, 835 startTime: startTime,
815 endTime: endTime, 836 endTime: endTime,
816 ); 837 );
  838 + _logInfo(
  839 + '$_hrvTrendLogMarker core_query_hrv_results_finish '
  840 + 'userId=$_userId startTime=$startTime endTime=$endTime '
  841 + 'count=${points.length} elapsedMs=${stopwatch.elapsedMilliseconds}',
  842 + );
  843 + return points;
817 } 844 }
818 845
819 Future<List<HealthRawRealtimeStressPoint>> queryRealtimeStressPoints({ 846 Future<List<HealthRawRealtimeStressPoint>> queryRealtimeStressPoints({
@@ -834,12 +861,19 @@ class OHOSHealthRawDataCoreService { @@ -834,12 +861,19 @@ class OHOSHealthRawDataCoreService {
834 Future<List<HealthRawDailyStressPoint>> queryDailyStressPoints({ 861 Future<List<HealthRawDailyStressPoint>> queryDailyStressPoints({
835 required int startDate, 862 required int startDate,
836 required int endDate, 863 required int endDate,
837 - }) {  
838 - return _localStore.queryDailyStressPoints( 864 + }) async {
  865 + final stopwatch = Stopwatch()..start();
  866 + final points = await _localStore.queryDailyStressPoints(
839 userId: _userId, 867 userId: _userId,
840 startDate: startDate, 868 startDate: startDate,
841 endDate: endDate, 869 endDate: endDate,
842 ); 870 );
  871 + _logInfo(
  872 + '$_hrvTrendLogMarker core_query_daily_stress_finish '
  873 + 'userId=$_userId startDate=$startDate endDate=$endDate '
  874 + 'count=${points.length} elapsedMs=${stopwatch.elapsedMilliseconds}',
  875 + );
  876 + return points;
843 } 877 }
844 878
845 Future<List<HealthRawSleepResult>> querySleepResults({ 879 Future<List<HealthRawSleepResult>> querySleepResults({
@@ -859,12 +893,20 @@ class OHOSHealthRawDataCoreService { @@ -859,12 +893,20 @@ class OHOSHealthRawDataCoreService {
859 required int endTime, 893 required int endTime,
860 int readChunkDays = defaultReadChunkDays, 894 int readChunkDays = defaultReadChunkDays,
861 }) async { 895 }) async {
862 - return _fetchRawDataInChunks( 896 + final stopwatch = Stopwatch()..start();
  897 + final points = await _fetchRawDataInChunks(
863 dataType, 898 dataType,
864 startTime, 899 startTime,
865 endTime, 900 endTime,
866 readChunkDays: readChunkDays, 901 readChunkDays: readChunkDays,
867 ); 902 );
  903 + _logInfo(
  904 + '$_hrvTrendLogMarker core_query_raw_data_finish '
  905 + 'userId=$_userId dataType=$dataType startTime=$startTime '
  906 + 'endTime=$endTime readChunkDays=$readChunkDays '
  907 + 'count=${points.length} elapsedMs=${stopwatch.elapsedMilliseconds}',
  908 + );
  909 + return points;
868 } 910 }
869 911
870 Future<List<HealthKitRawDataPoint>> queryRawSleepIntervals({ 912 Future<List<HealthKitRawDataPoint>> queryRawSleepIntervals({
@@ -1189,21 +1231,23 @@ class OHOSHealthRawDataCoreService { @@ -1189,21 +1231,23 @@ class OHOSHealthRawDataCoreService {
1189 } 1231 }
1190 } 1232 }
1191 1233
1192 - Future<List<OhosHealthRawDataSyncResult>> _syncCalculationRawDataIfNeeded({ 1234 + Future<OhosHealthRawDataCalculationSyncSnapshot?>
  1235 + _syncCalculationRawDataIfNeeded({
1193 required int? startTime, 1236 required int? startTime,
1194 required int endTime, 1237 required int endTime,
1195 }) async { 1238 }) async {
1196 final rawDataSource = _rawDataSource; 1239 final rawDataSource = _rawDataSource;
1197 if (rawDataSource is! OhosHealthRawDataSource) { 1240 if (rawDataSource is! OhosHealthRawDataSource) {
1198 - return const <OhosHealthRawDataSyncResult>[]; 1241 + return null;
1199 } 1242 }
1200 - return rawDataSource.syncCalculationRawData( 1243 + return rawDataSource.syncCalculationRawDataSnapshot(
1201 startTime: startTime, 1244 startTime: startTime,
1202 endTime: endTime, 1245 endTime: endTime,
1203 ); 1246 );
1204 } 1247 }
1205 1248
1206 - Future<List<OhosHealthRawDataSyncResult>> _syncCalculationRawDataSafely({ 1249 + Future<OhosHealthRawDataCalculationSyncSnapshot?>
  1250 + _syncCalculationRawDataSafely({
1207 required bool hasAuthorization, 1251 required bool hasAuthorization,
1208 required int? startTime, 1252 required int? startTime,
1209 required int endTime, 1253 required int endTime,
@@ -1213,7 +1257,7 @@ class OHOSHealthRawDataCoreService { @@ -1213,7 +1257,7 @@ class OHOSHealthRawDataCoreService {
1213 '$_calculateLogMarker sync_skipped reason=no_health_privacy_permission ' 1257 '$_calculateLogMarker sync_skipped reason=no_health_privacy_permission '
1214 'startTime=$startTime endTime=$endTime', 1258 'startTime=$startTime endTime=$endTime',
1215 ); 1259 );
1216 - return const <OhosHealthRawDataSyncResult>[]; 1260 + return null;
1217 } 1261 }
1218 try { 1262 try {
1219 return await _syncCalculationRawDataIfNeeded( 1263 return await _syncCalculationRawDataIfNeeded(
@@ -1573,6 +1617,35 @@ class OHOSHealthRawDataCoreService { @@ -1573,6 +1617,35 @@ class OHOSHealthRawDataCoreService {
1573 return points; 1617 return points;
1574 } 1618 }
1575 1619
  1620 + Future<List<HealthKitRawDataPoint>> _fetchRawDataForCalculation(
  1621 + int dataType,
  1622 + int startTime,
  1623 + int endTime, {
  1624 + required OhosHealthRawDataMemorySnapshot? rawDataSnapshot,
  1625 + required int readChunkDays,
  1626 + }) async {
  1627 + final rawDataSource = _rawDataSource;
  1628 + if (rawDataSnapshot != null && rawDataSource is OhosHealthRawDataSource) {
  1629 + final points = rawDataSource.getRawDataFromSnapshot(
  1630 + snapshot: rawDataSnapshot,
  1631 + dataType: dataType,
  1632 + startTime: startTime,
  1633 + endTime: endTime,
  1634 + )..sort((a, b) => a.endTime.compareTo(b.endTime));
  1635 + _logInfo(
  1636 + '$_calculateLogMarker raw_snapshot_hit dataType=$dataType '
  1637 + 'startTime=$startTime endTime=$endTime count=${points.length}',
  1638 + );
  1639 + return points;
  1640 + }
  1641 + return _fetchRawDataInChunks(
  1642 + dataType,
  1643 + startTime,
  1644 + endTime,
  1645 + readChunkDays: readChunkDays,
  1646 + );
  1647 + }
  1648 +
1576 Future<List<HealthKitRawDataPoint>> _fetchSleepIntervalsInChunks( 1649 Future<List<HealthKitRawDataPoint>> _fetchSleepIntervalsInChunks(
1577 int startTime, 1650 int startTime,
1578 int endTime, { 1651 int endTime, {
@@ -1590,6 +1663,32 @@ class OHOSHealthRawDataCoreService { @@ -1590,6 +1663,32 @@ class OHOSHealthRawDataCoreService {
1590 return points; 1663 return points;
1591 } 1664 }
1592 1665
  1666 + Future<List<HealthKitRawDataPoint>> _fetchSleepIntervalsForCalculation(
  1667 + int startTime,
  1668 + int endTime, {
  1669 + required OhosHealthRawDataMemorySnapshot? rawDataSnapshot,
  1670 + required int readChunkDays,
  1671 + }) async {
  1672 + final rawDataSource = _rawDataSource;
  1673 + if (rawDataSnapshot != null && rawDataSource is OhosHealthRawDataSource) {
  1674 + final points = rawDataSource.getRawSleepIntervalsFromSnapshot(
  1675 + snapshot: rawDataSnapshot,
  1676 + startTime: startTime,
  1677 + endTime: endTime,
  1678 + )..sort((a, b) => a.endTime.compareTo(b.endTime));
  1679 + _logInfo(
  1680 + '$_calculateLogMarker sleep_snapshot_hit '
  1681 + 'startTime=$startTime endTime=$endTime count=${points.length}',
  1682 + );
  1683 + return points;
  1684 + }
  1685 + return _fetchSleepIntervalsInChunks(
  1686 + startTime,
  1687 + endTime,
  1688 + readChunkDays: readChunkDays,
  1689 + );
  1690 + }
  1691 +
1593 Future<List<HealthKitRawWorkoutDataPoint>> _fetchWorkoutIntervalsInChunks( 1692 Future<List<HealthKitRawWorkoutDataPoint>> _fetchWorkoutIntervalsInChunks(
1594 int startTime, 1693 int startTime,
1595 int endTime, { 1694 int endTime, {
@@ -1607,6 +1706,33 @@ class OHOSHealthRawDataCoreService { @@ -1607,6 +1706,33 @@ class OHOSHealthRawDataCoreService {
1607 return points; 1706 return points;
1608 } 1707 }
1609 1708
  1709 + Future<List<HealthKitRawWorkoutDataPoint>>
  1710 + _fetchWorkoutIntervalsForCalculation(
  1711 + int startTime,
  1712 + int endTime, {
  1713 + required OhosHealthRawDataMemorySnapshot? rawDataSnapshot,
  1714 + required int readChunkDays,
  1715 + }) async {
  1716 + final rawDataSource = _rawDataSource;
  1717 + if (rawDataSnapshot != null && rawDataSource is OhosHealthRawDataSource) {
  1718 + final points = rawDataSource.getRawWorkoutDataFromSnapshot(
  1719 + snapshot: rawDataSnapshot,
  1720 + startTime: startTime,
  1721 + endTime: endTime,
  1722 + )..sort((a, b) => a.endTime.compareTo(b.endTime));
  1723 + _logInfo(
  1724 + '$_calculateLogMarker workout_snapshot_hit '
  1725 + 'startTime=$startTime endTime=$endTime count=${points.length}',
  1726 + );
  1727 + return points;
  1728 + }
  1729 + return _fetchWorkoutIntervalsInChunks(
  1730 + startTime,
  1731 + endTime,
  1732 + readChunkDays: readChunkDays,
  1733 + );
  1734 + }
  1735 +
1610 static int? _minNullable(int? a, int? b) { 1736 static int? _minNullable(int? a, int? b) {
1611 if (a == null) return b; 1737 if (a == null) return b;
1612 if (b == null) return a; 1738 if (b == null) return a;
@@ -1628,13 +1754,15 @@ class OHOSHealthRawDataCoreService { @@ -1628,13 +1754,15 @@ class OHOSHealthRawDataCoreService {
1628 }) { 1754 }) {
1629 if (!_isDebug) return; 1755 if (!_isDebug) return;
1630 _toastSink?.call( 1756 _toastSink?.call(
1631 - '【测试】本轮同步耗时${_elapsedSecondsText(syncElapsed)} s、' 1757 + '【测试】获取数据耗时${_elapsedSecondsText(syncElapsed)} s、'
1632 '计算耗时${_elapsedSecondsText(calculationElapsed)} s', 1758 '计算耗时${_elapsedSecondsText(calculationElapsed)} s',
1633 ); 1759 );
1634 } 1760 }
1635 1761
1636 - bool _hasStoredRawData(List<OhosHealthRawDataSyncResult> syncResults) {  
1637 - return syncResults.any((result) => result.storedCount > 0); 1762 + bool _hasFetchedRawData(List<OhosHealthRawDataSyncResult> syncResults) {
  1763 + return syncResults.any(
  1764 + (result) => result.fetchedCount > 0 || result.storedCount > 0,
  1765 + );
1638 } 1766 }
1639 1767
1640 bool _hasCalculatedResult(HealthRawStressCalculationResult result) { 1768 bool _hasCalculatedResult(HealthRawStressCalculationResult result) {
@@ -24,6 +24,7 @@ class OhosHealthRawDataSqliteStore implements OhosHealthRawDataLocalStore { @@ -24,6 +24,7 @@ class OhosHealthRawDataSqliteStore implements OhosHealthRawDataLocalStore {
24 static const sleepDataTable = 'ohos_sleep_data'; 24 static const sleepDataTable = 'ohos_sleep_data';
25 static const activityGoalTable = 'ohos_activity_goal'; 25 static const activityGoalTable = 'ohos_activity_goal';
26 static const logMarker = '[OHOS_RAW_DATA_DB]'; 26 static const logMarker = '[OHOS_RAW_DATA_DB]';
  27 + static const hrvTrendLogMarker = '[OHOS_HRV_TREND_PROFILE]';
27 28
28 final int Function()? _userIdProvider; 29 final int Function()? _userIdProvider;
29 final Directory? _rootDirectory; 30 final Directory? _rootDirectory;
@@ -282,6 +283,7 @@ class OhosHealthRawDataSqliteStore implements OhosHealthRawDataLocalStore { @@ -282,6 +283,7 @@ class OhosHealthRawDataSqliteStore implements OhosHealthRawDataLocalStore {
282 required int startTime, 283 required int startTime,
283 required int endTime, 284 required int endTime,
284 }) async { 285 }) async {
  286 + final stopwatch = Stopwatch()..start();
285 final db = await _database(_userId); 287 final db = await _database(_userId);
286 if (dataType == OhosHealthRawDataType.sleepAnalysis) { 288 if (dataType == OhosHealthRawDataType.sleepAnalysis) {
287 final rows = await db.query( 289 final rows = await db.query(
@@ -290,7 +292,13 @@ class OhosHealthRawDataSqliteStore implements OhosHealthRawDataLocalStore { @@ -290,7 +292,13 @@ class OhosHealthRawDataSqliteStore implements OhosHealthRawDataLocalStore {
290 whereArgs: [startTime, endTime], 292 whereArgs: [startTime, endTime],
291 orderBy: 'from_time ASC', 293 orderBy: 'from_time ASC',
292 ); 294 );
293 - return rows.map(_sleepItemFromRow).toList(growable: false); 295 + final items = rows.map(_sleepItemFromRow).toList(growable: false);
  296 + _log(
  297 + '$hrvTrendLogMarker raw_db_query_finish dataType=$dataType '
  298 + 'startTime=$startTime endTime=$endTime rows=${rows.length} '
  299 + 'elapsedMs=${stopwatch.elapsedMilliseconds}',
  300 + );
  301 + return items;
294 } 302 }
295 if (dataType == OhosHealthRawDataType.workout) { 303 if (dataType == OhosHealthRawDataType.workout) {
296 final table = _rawDataTable(dataType); 304 final table = _rawDataTable(dataType);
@@ -301,9 +309,15 @@ class OhosHealthRawDataSqliteStore implements OhosHealthRawDataLocalStore { @@ -301,9 +309,15 @@ class OhosHealthRawDataSqliteStore implements OhosHealthRawDataLocalStore {
301 whereArgs: [startTime, endTime], 309 whereArgs: [startTime, endTime],
302 orderBy: 'from_time ASC', 310 orderBy: 'from_time ASC',
303 ); 311 );
304 - return rows 312 + final items = rows
305 .map((row) => _intervalItemFromRow(row, dataType)) 313 .map((row) => _intervalItemFromRow(row, dataType))
306 .toList(growable: false); 314 .toList(growable: false);
  315 + _log(
  316 + '$hrvTrendLogMarker raw_db_query_finish dataType=$dataType '
  317 + 'table=$table startTime=$startTime endTime=$endTime '
  318 + 'rows=${rows.length} elapsedMs=${stopwatch.elapsedMilliseconds}',
  319 + );
  320 + return items;
307 } 321 }
308 322
309 final storedDataType = _storedHealthDataType(dataType); 323 final storedDataType = _storedHealthDataType(dataType);
@@ -315,9 +329,16 @@ class OhosHealthRawDataSqliteStore implements OhosHealthRawDataLocalStore { @@ -315,9 +329,16 @@ class OhosHealthRawDataSqliteStore implements OhosHealthRawDataLocalStore {
315 whereArgs: [startTime, endTime], 329 whereArgs: [startTime, endTime],
316 orderBy: 'time ASC', 330 orderBy: 'time ASC',
317 ); 331 );
318 - return rows 332 + final items = rows
319 .map((row) => _rawItemFromRow(row, storedDataType)) 333 .map((row) => _rawItemFromRow(row, storedDataType))
320 .toList(growable: false); 334 .toList(growable: false);
  335 + _log(
  336 + '$hrvTrendLogMarker raw_db_query_finish dataType=$dataType '
  337 + 'storedDataType=$storedDataType table=$table startTime=$startTime '
  338 + 'endTime=$endTime rows=${rows.length} '
  339 + 'elapsedMs=${stopwatch.elapsedMilliseconds}',
  340 + );
  341 + return items;
321 } 342 }
322 343
323 @override 344 @override
  1 +part of 'ohos_health_raw_data_sync_service.dart';
  2 +
  3 +class OhosHealthRawDataMemorySnapshot {
  4 + OhosHealthRawDataMemorySnapshot({
  5 + required Iterable<OhosHealthRawDataSyncResult> results,
  6 + }) {
  7 + for (final result in results) {
  8 + for (final item in result.rawItems) {
  9 + _itemCount += 1;
  10 + _add(result.dataType, item);
  11 + if (item.dataType != result.dataType) {
  12 + _add(item.dataType, item);
  13 + }
  14 + }
  15 + }
  16 + for (final items in _itemsByDataType.values) {
  17 + items.sort((a, b) => _itemEndTime(a).compareTo(_itemEndTime(b)));
  18 + }
  19 + }
  20 +
  21 + final Map<int, List<OhosHealthRawDataItem>> _itemsByDataType =
  22 + <int, List<OhosHealthRawDataItem>>{};
  23 + var _itemCount = 0;
  24 +
  25 + void _add(int dataType, OhosHealthRawDataItem item) {
  26 + _itemsByDataType
  27 + .putIfAbsent(dataType, () => <OhosHealthRawDataItem>[])
  28 + .add(item);
  29 + }
  30 +
  31 + bool get isEmpty => _itemsByDataType.values.every((items) => items.isEmpty);
  32 +
  33 + int get length => _itemCount;
  34 +
  35 + List<OhosHealthRawDataItem> query({
  36 + required int dataType,
  37 + required int startTime,
  38 + required int endTime,
  39 + }) {
  40 + final items = _itemsByDataType[dataType];
  41 + if (items == null || items.isEmpty) return const <OhosHealthRawDataItem>[];
  42 + return items
  43 + .where(
  44 + (item) =>
  45 + _itemEndTime(item) >= startTime &&
  46 + _itemStartTime(item) <= endTime,
  47 + )
  48 + .toList(growable: false);
  49 + }
  50 +
  51 + int? earliestTime() {
  52 + int? earliest;
  53 + for (final items in _itemsByDataType.values) {
  54 + for (final item in items) {
  55 + final time = _dedupeKeyTime(item);
  56 + earliest = earliest == null ? time : math.min(earliest, time);
  57 + }
  58 + }
  59 + return earliest;
  60 + }
  61 +
  62 + static int _itemStartTime(OhosHealthRawDataItem item) {
  63 + return _numPayload(item.payload, 'from_time') ??
  64 + _numPayload(item.payload, 'start_time') ??
  65 + item.dataTime;
  66 + }
  67 +
  68 + static int _itemEndTime(OhosHealthRawDataItem item) {
  69 + return _numPayload(item.payload, 'to_time') ??
  70 + _numPayload(item.payload, 'end_time') ??
  71 + _numPayload(item.payload, 'time') ??
  72 + item.dataTime;
  73 + }
  74 +
  75 + static int _dedupeKeyTime(OhosHealthRawDataItem item) {
  76 + return _numPayload(item.payload, 'from_time') ??
  77 + _numPayload(item.payload, 'start_time') ??
  78 + _numPayload(item.payload, 'time') ??
  79 + item.dataTime;
  80 + }
  81 +
  82 + static int? _numPayload(Map<String, Object?> payload, String key) {
  83 + final value = payload[key];
  84 + return value is num ? value.toInt() : null;
  85 + }
  86 +}
  87 +
  88 +class OhosHealthRawDataCalculationSyncSnapshot {
  89 + const OhosHealthRawDataCalculationSyncSnapshot({
  90 + required this.results,
  91 + required this.rawData,
  92 + this.activityGoal,
  93 + this.storeFuture,
  94 + });
  95 +
  96 + final List<OhosHealthRawDataSyncResult> results;
  97 + final OhosHealthRawDataMemorySnapshot rawData;
  98 + final V2ActivityTarget? activityGoal;
  99 + final Future<void>? storeFuture;
  100 +}
@@ -16,6 +16,8 @@ import 'package:flutter/foundation.dart'; @@ -16,6 +16,8 @@ import 'package:flutter/foundation.dart';
16 import 'huawei_health_data_type.dart'; 16 import 'huawei_health_data_type.dart';
17 import 'ohos_health_raw_data_events.dart'; 17 import 'ohos_health_raw_data_events.dart';
18 18
  19 +part 'ohos_health_raw_data_memory_snapshot.dart';
  20 +
19 class OhosHealthRawDataType { 21 class OhosHealthRawDataType {
20 const OhosHealthRawDataType._(); 22 const OhosHealthRawDataType._();
21 23
@@ -44,6 +46,8 @@ class OhosHealthRawDataSyncService { @@ -44,6 +46,8 @@ class OhosHealthRawDataSyncService {
44 static const int defaultMaxConcurrentFetches = 10; 46 static const int defaultMaxConcurrentFetches = 10;
45 static const String logMarker = '[OHOS_HEALTH_RAW_SYNC]'; 47 static const String logMarker = '[OHOS_HEALTH_RAW_SYNC]';
46 static const String profileLogMarker = '[OHOS_HEALTH_RAW_PROFILE]'; 48 static const String profileLogMarker = '[OHOS_HEALTH_RAW_PROFILE]';
  49 + static const String timingLogMarker = '[OHOS_HEALTH_TIMING]';
  50 + static const String hrvTrendLogMarker = '[OHOS_HRV_TREND_PROFILE]';
47 static final List<int> calculationDataTypes = List<int>.unmodifiable( 51 static final List<int> calculationDataTypes = List<int>.unmodifiable(
48 <int>[ 52 <int>[
49 for (final type in HuaweiHealthDataType.values) type.dataType, 53 for (final type in HuaweiHealthDataType.values) type.dataType,
@@ -257,6 +261,130 @@ class OhosHealthRawDataSyncService { @@ -257,6 +261,130 @@ class OhosHealthRawDataSyncService {
257 return results; 261 return results;
258 } 262 }
259 263
  264 + Future<OhosHealthRawDataCalculationSyncSnapshot>
  265 + syncCalculationRawDataSnapshot({
  266 + int? startTime,
  267 + int? endTime,
  268 + List<int>? dataTypes,
  269 + }) async {
  270 + final totalStopwatch = Stopwatch()..start();
  271 + final resolvedEndTime = endTime ?? _unixSeconds(_nowProvider());
  272 + final earliestStartTime = _twoMonthLookbackStart(resolvedEndTime);
  273 + final eventStartTime = startTime == null
  274 + ? earliestStartTime
  275 + : math.max(startTime, earliestStartTime);
  276 + final resolvedDataTypes = dataTypes ?? calculationDataTypes;
  277 + _log(
  278 + 'calculation_sync_snapshot_start '
  279 + 'dataTypes=${resolvedDataTypes.join(',')} '
  280 + 'startTime=${startTime ?? ''} endTime=$resolvedEndTime',
  281 + );
  282 + _publishSyncEvent(
  283 + type: OhosHealthRawDataPipelineEventType.syncStarted,
  284 + flow: 'syncCalculationRawDataSnapshot',
  285 + dataTypes: resolvedDataTypes,
  286 + startTime: eventStartTime,
  287 + endTime: resolvedEndTime,
  288 + );
  289 + try {
  290 + final activityGoalFuture = _fetchActivityGoalForCalculationSync();
  291 + final rawSyncFuture = Future.wait(
  292 + resolvedDataTypes.map(
  293 + (dataType) => _syncRawDataForCalculationSnapshot(
  294 + dataType: dataType,
  295 + startTime: startTime,
  296 + endTime: resolvedEndTime,
  297 + ),
  298 + ),
  299 + eagerError: true,
  300 + );
  301 + final fetched = await Future.wait<Object?>(
  302 + <Future<Object?>>[
  303 + activityGoalFuture,
  304 + rawSyncFuture,
  305 + ],
  306 + eagerError: true,
  307 + );
  308 + final activityGoal = fetched[0] as V2ActivityTarget?;
  309 + final results = fetched[1] as List<OhosHealthRawDataSyncResult>;
  310 + final rawData = OhosHealthRawDataMemorySnapshot(
  311 + results: results,
  312 + );
  313 + final pageCount = results.fold<int>(
  314 + 0,
  315 + (sum, result) => sum + result.pageCount,
  316 + );
  317 + final fetchedCount = results.fold<int>(
  318 + 0,
  319 + (sum, result) => sum + result.fetchedCount,
  320 + );
  321 + final storeFuture = _storeCalculationSnapshotInBackground(
  322 + results: results,
  323 + activityGoal: activityGoal,
  324 + );
  325 + unawaited(
  326 + storeFuture.catchError((Object error, StackTrace stackTrace) {
  327 + _log(
  328 + '$timingLogMarker db_store_failed '
  329 + 'dataTypes=${resolvedDataTypes.join(',')} '
  330 + 'error=${_describeError(error)} stackTrace=$stackTrace',
  331 + );
  332 + }),
  333 + );
  334 + _log(
  335 + 'calculation_sync_snapshot_finish '
  336 + 'dataTypes=${resolvedDataTypes.join(',')} '
  337 + 'pageCount=$pageCount fetchedCount=$fetchedCount '
  338 + 'snapshotCount=${rawData.length}',
  339 + );
  340 + _log(
  341 + '$timingLogMarker fetch_all_finish '
  342 + 'dataTypes=${resolvedDataTypes.join(',')} '
  343 + 'pageCount=$pageCount fetchedCount=$fetchedCount '
  344 + 'elapsedMs=${totalStopwatch.elapsedMilliseconds}',
  345 + );
  346 + _publishSyncEvent(
  347 + type: OhosHealthRawDataPipelineEventType.syncSucceeded,
  348 + flow: 'syncCalculationRawDataSnapshot',
  349 + dataTypes: resolvedDataTypes,
  350 + startTime: eventStartTime,
  351 + endTime: resolvedEndTime,
  352 + elapsedMs: totalStopwatch.elapsedMilliseconds,
  353 + pageCount: pageCount,
  354 + storedCount: 0,
  355 + );
  356 + return OhosHealthRawDataCalculationSyncSnapshot(
  357 + results: results,
  358 + rawData: rawData,
  359 + activityGoal: activityGoal,
  360 + storeFuture: storeFuture,
  361 + );
  362 + } catch (error, stackTrace) {
  363 + _log(
  364 + 'calculation_sync_snapshot_failed '
  365 + 'dataTypes=${resolvedDataTypes.join(',')} '
  366 + 'startTime=${startTime ?? ''} endTime=$resolvedEndTime '
  367 + 'error=${_describeError(error)} stackTrace=$stackTrace',
  368 + );
  369 + _profileLog(
  370 + 'calculationSync_fetchAll_failed '
  371 + 'dataTypes=${resolvedDataTypes.join(',')} '
  372 + 'elapsedMs=${totalStopwatch.elapsedMilliseconds} '
  373 + 'error=${_describeError(error)}',
  374 + );
  375 + _publishSyncEvent(
  376 + type: OhosHealthRawDataPipelineEventType.syncFailed,
  377 + flow: 'syncCalculationRawDataSnapshot',
  378 + dataTypes: resolvedDataTypes,
  379 + startTime: eventStartTime,
  380 + endTime: resolvedEndTime,
  381 + elapsedMs: totalStopwatch.elapsedMilliseconds,
  382 + error: _describeError(error),
  383 + );
  384 + rethrow;
  385 + }
  386 + }
  387 +
260 Future<V2ActivityTarget?> _fetchActivityGoalForCalculationSync() async { 388 Future<V2ActivityTarget?> _fetchActivityGoalForCalculationSync() async {
261 final stopwatch = Stopwatch()..start(); 389 final stopwatch = Stopwatch()..start();
262 try { 390 try {
@@ -339,16 +467,66 @@ class OhosHealthRawDataSyncService { @@ -339,16 +467,66 @@ class OhosHealthRawDataSyncService {
339 } 467 }
340 } 468 }
341 469
  470 + Future<OhosHealthRawDataSyncResult> _syncRawDataForCalculationSnapshot({
  471 + required int dataType,
  472 + required int? startTime,
  473 + required int endTime,
  474 + }) async {
  475 + final stopwatch = Stopwatch()..start();
  476 + final resolvedStartTime = await _resolveStartTime(
  477 + dataType: dataType,
  478 + requestedStartTime: startTime,
  479 + endTime: endTime,
  480 + );
  481 + if (endTime < resolvedStartTime) {
  482 + throw ArgumentError.value(endTime, 'endTime');
  483 + }
  484 + _profileLog(
  485 + 'fetchRawDataSnapshot_resolved dataType=$dataType '
  486 + 'requestedStartTime=${startTime ?? ''} startTime=$resolvedStartTime '
  487 + 'endTime=$endTime resolveElapsedMs=${stopwatch.elapsedMilliseconds}',
  488 + );
  489 + try {
  490 + final result = await _syncResolvedRawData(
  491 + dataType: dataType,
  492 + startTime: resolvedStartTime,
  493 + endTime: endTime,
  494 + storeRawData: false,
  495 + );
  496 + _profileLog(
  497 + 'fetchRawDataSnapshot_finish dataType=$dataType '
  498 + 'segments=${result.segmentCount} pageCount=${result.pageCount} '
  499 + 'fetchedCount=${result.fetchedCount} '
  500 + 'elapsedMs=${stopwatch.elapsedMilliseconds}',
  501 + );
  502 + return result;
  503 + } catch (error) {
  504 + _profileLog(
  505 + 'fetchRawDataSnapshot_failed dataType=$dataType '
  506 + 'elapsedMs=${stopwatch.elapsedMilliseconds} '
  507 + 'error=${_describeError(error)}',
  508 + );
  509 + rethrow;
  510 + }
  511 + }
  512 +
342 Future<List<OhosHealthRawDataItem>> queryRawData({ 513 Future<List<OhosHealthRawDataItem>> queryRawData({
343 required int dataType, 514 required int dataType,
344 required int startTime, 515 required int startTime,
345 required int endTime, 516 required int endTime,
346 - }) {  
347 - return _localStore.queryRawData( 517 + }) async {
  518 + final stopwatch = Stopwatch()..start();
  519 + final items = await _localStore.queryRawData(
348 dataType: dataType, 520 dataType: dataType,
349 startTime: startTime, 521 startTime: startTime,
350 endTime: endTime, 522 endTime: endTime,
351 ); 523 );
  524 + _log(
  525 + '$hrvTrendLogMarker sync_query_raw_finish '
  526 + 'dataType=$dataType startTime=$startTime endTime=$endTime '
  527 + 'count=${items.length} elapsedMs=${stopwatch.elapsedMilliseconds}',
  528 + );
  529 + return items;
352 } 530 }
353 531
354 Future<V2ActivityTarget?> getActivityGoal({bool refresh = true}) async { 532 Future<V2ActivityTarget?> getActivityGoal({bool refresh = true}) async {
@@ -385,6 +563,7 @@ class OhosHealthRawDataSyncService { @@ -385,6 +563,7 @@ class OhosHealthRawDataSyncService {
385 required int startTime, 563 required int startTime,
386 required int endTime, 564 required int endTime,
387 Future<void>? storeGate, 565 Future<void>? storeGate,
  566 + bool storeRawData = true,
388 }) async { 567 }) async {
389 final stopwatch = Stopwatch()..start(); 568 final stopwatch = Stopwatch()..start();
390 final fetchRanges = _splitIntoFetchRanges( 569 final fetchRanges = _splitIntoFetchRanges(
@@ -415,6 +594,7 @@ class OhosHealthRawDataSyncService { @@ -415,6 +594,7 @@ class OhosHealthRawDataSyncService {
415 var fetchedItems = 0; 594 var fetchedItems = 0;
416 var storedCount = 0; 595 var storedCount = 0;
417 int? earliestStoredTime; 596 int? earliestStoredTime;
  597 + final rawItems = <OhosHealthRawDataItem>[];
418 try { 598 try {
419 while (pending.isNotEmpty) { 599 while (pending.isNotEmpty) {
420 final outcome = await Future.any(pending); 600 final outcome = await Future.any(pending);
@@ -428,34 +608,37 @@ class OhosHealthRawDataSyncService { @@ -428,34 +608,37 @@ class OhosHealthRawDataSyncService {
428 final page = segment.page; 608 final page = segment.page;
429 pageCount += 1; 609 pageCount += 1;
430 fetchedItems += page.items.length; 610 fetchedItems += page.items.length;
  611 + rawItems.addAll(page.items);
431 if (page.items.isNotEmpty) { 612 if (page.items.isNotEmpty) {
432 - if (storeGate != null) await storeGate;  
433 - final pageStoreStopwatch = Stopwatch()..start();  
434 - final pageStoredCount = await _localStore.upsertRawDataBatch(  
435 - dataType: dataType,  
436 - items: page.items,  
437 - );  
438 - storedCount += pageStoredCount;  
439 - if (pageStoredCount > 0) {  
440 - for (final item in page.items) {  
441 - final keyTime = _dedupeKeyTime(dataType: dataType, item: item);  
442 - earliestStoredTime = earliestStoredTime == null  
443 - ? keyTime  
444 - : math.min(earliestStoredTime, keyTime); 613 + if (storeRawData) {
  614 + if (storeGate != null) await storeGate;
  615 + final pageStoreStopwatch = Stopwatch()..start();
  616 + final pageStoredCount = await _localStore.upsertRawDataBatch(
  617 + dataType: dataType,
  618 + items: page.items,
  619 + );
  620 + storedCount += pageStoredCount;
  621 + if (pageStoredCount > 0) {
  622 + for (final item in page.items) {
  623 + final keyTime = _dedupeKeyTime(dataType: dataType, item: item);
  624 + earliestStoredTime = earliestStoredTime == null
  625 + ? keyTime
  626 + : math.min(earliestStoredTime, keyTime);
  627 + }
445 } 628 }
  629 + _profileLog(
  630 + 'page_store_finish dataType=$dataType '
  631 + 'segment=${segment.segmentIndex + 1}/${fetchRanges.length} '
  632 + 'fetchedItems=${page.items.length} storedItems=$pageStoredCount '
  633 + 'elapsedMs=${pageStoreStopwatch.elapsedMilliseconds}',
  634 + );
  635 + _log(
  636 + 'page_stored dataType=$dataType '
  637 + 'segment=${segment.segmentIndex + 1}/${fetchRanges.length} '
  638 + 'fetchedItems=${page.items.length} '
  639 + 'storedItems=$pageStoredCount totalStored=$storedCount',
  640 + );
446 } 641 }
447 - _profileLog(  
448 - 'page_store_finish dataType=$dataType '  
449 - 'segment=${segment.segmentIndex + 1}/${fetchRanges.length} '  
450 - 'fetchedItems=${page.items.length} storedItems=$pageStoredCount '  
451 - 'elapsedMs=${pageStoreStopwatch.elapsedMilliseconds}',  
452 - );  
453 - _log(  
454 - 'page_stored dataType=$dataType '  
455 - 'segment=${segment.segmentIndex + 1}/${fetchRanges.length} '  
456 - 'fetchedItems=${page.items.length} '  
457 - 'storedItems=$pageStoredCount totalStored=$storedCount',  
458 - );  
459 } 642 }
460 643
461 _log( 644 _log(
@@ -500,6 +683,43 @@ class OhosHealthRawDataSyncService { @@ -500,6 +683,43 @@ class OhosHealthRawDataSyncService {
500 pageCount: pageCount, 683 pageCount: pageCount,
501 storedCount: storedCount, 684 storedCount: storedCount,
502 earliestStoredTime: earliestStoredTime, 685 earliestStoredTime: earliestStoredTime,
  686 + fetchedCount: fetchedItems,
  687 + rawItems: List<OhosHealthRawDataItem>.unmodifiable(rawItems),
  688 + );
  689 + }
  690 +
  691 + Future<void> _storeCalculationSnapshotInBackground({
  692 + required List<OhosHealthRawDataSyncResult> results,
  693 + required V2ActivityTarget? activityGoal,
  694 + }) async {
  695 + final stopwatch = Stopwatch()..start();
  696 + var storedCount = 0;
  697 + if (activityGoal != null) {
  698 + final goalStopwatch = Stopwatch()..start();
  699 + await _localStore.upsertActivityGoal(activityGoal);
  700 + _log(
  701 + '$timingLogMarker db_store_activity_goal_finish '
  702 + 'elapsedMs=${goalStopwatch.elapsedMilliseconds}',
  703 + );
  704 + }
  705 + for (final result in results) {
  706 + if (result.rawItems.isEmpty) continue;
  707 + final typeStopwatch = Stopwatch()..start();
  708 + final count = await _localStore.upsertRawDataBatch(
  709 + dataType: result.dataType,
  710 + items: result.rawItems,
  711 + );
  712 + storedCount += count;
  713 + _log(
  714 + '$timingLogMarker db_store_type_finish '
  715 + 'dataType=${result.dataType} fetched=${result.rawItems.length} '
  716 + 'stored=$count elapsedMs=${typeStopwatch.elapsedMilliseconds}',
  717 + );
  718 + }
  719 + _log(
  720 + '$timingLogMarker db_store_finish '
  721 + 'dataTypes=${results.map((result) => result.dataType).join(',')} '
  722 + 'storedCount=$storedCount elapsedMs=${stopwatch.elapsedMilliseconds}',
503 ); 723 );
504 } 724 }
505 725
@@ -1022,6 +1242,8 @@ class OhosHealthRawDataSyncResult { @@ -1022,6 +1242,8 @@ class OhosHealthRawDataSyncResult {
1022 required this.pageCount, 1242 required this.pageCount,
1023 required this.storedCount, 1243 required this.storedCount,
1024 this.earliestStoredTime, 1244 this.earliestStoredTime,
  1245 + this.fetchedCount = 0,
  1246 + this.rawItems = const <OhosHealthRawDataItem>[],
1025 }); 1247 });
1026 1248
1027 final int dataType; 1249 final int dataType;
@@ -1031,6 +1253,8 @@ class OhosHealthRawDataSyncResult { @@ -1031,6 +1253,8 @@ class OhosHealthRawDataSyncResult {
1031 final int pageCount; 1253 final int pageCount;
1032 final int storedCount; 1254 final int storedCount;
1033 final int? earliestStoredTime; 1255 final int? earliestStoredTime;
  1256 + final int fetchedCount;
  1257 + final List<OhosHealthRawDataItem> rawItems;
1034 1258
1035 @override 1259 @override
1036 String toString() { 1260 String toString() {
@@ -1041,6 +1265,7 @@ class OhosHealthRawDataSyncResult { @@ -1041,6 +1265,7 @@ class OhosHealthRawDataSyncResult {
1041 'segmentCount=$segmentCount, ' 1265 'segmentCount=$segmentCount, '
1042 'pageCount=$pageCount, ' 1266 'pageCount=$pageCount, '
1043 'storedCount=$storedCount, ' 1267 'storedCount=$storedCount, '
  1268 + 'fetchedCount=$fetchedCount, '
1044 'earliestStoredTime=$earliestStoredTime' 1269 'earliestStoredTime=$earliestStoredTime'
1045 ')'; 1270 ')';
1046 } 1271 }
@@ -4,6 +4,7 @@ import 'package:doublefeel_flutter/data/models/health/activity/activity_burn_sta @@ -4,6 +4,7 @@ import 'package:doublefeel_flutter/data/models/health/activity/activity_burn_sta
4 import 'package:doublefeel_flutter/data/models/health/health_v2_models.dart'; 4 import 'package:doublefeel_flutter/data/models/health/health_v2_models.dart';
5 import 'package:doublefeel_flutter/data/models/health/hrv/hrv_statistics_data.dart'; 5 import 'package:doublefeel_flutter/data/models/health/hrv/hrv_statistics_data.dart';
6 import 'package:doublefeel_flutter/data/models/health/sleep/sleep_statistics_data.dart'; 6 import 'package:doublefeel_flutter/data/models/health/sleep/sleep_statistics_data.dart';
  7 +import 'package:flutter/foundation.dart';
7 import 'package:get/get_core/src/get_main.dart'; 8 import 'package:get/get_core/src/get_main.dart';
8 import 'package:get/get_instance/src/extension_instance.dart'; 9 import 'package:get/get_instance/src/extension_instance.dart';
9 10
@@ -19,6 +20,7 @@ class HealthDataSourceWrapper implements HealthDataSource { @@ -19,6 +20,7 @@ class HealthDataSourceWrapper implements HealthDataSource {
19 final HealthDataSource remoteDataSource; 20 final HealthDataSource remoteDataSource;
20 final HealthDataSource localDataSource; 21 final HealthDataSource localDataSource;
21 final _myUserId = Get.find<UserStateService>().userId; 22 final _myUserId = Get.find<UserStateService>().userId;
  23 + static const _hrvTrendLogMarker = '[OHOS_HRV_TREND_PROFILE]';
22 24
23 @override 25 @override
24 Future<AppResult<SleepStatisticsData>> getSleepStatistics( 26 Future<AppResult<SleepStatisticsData>> getSleepStatistics(
@@ -60,17 +62,31 @@ class HealthDataSourceWrapper implements HealthDataSource { @@ -60,17 +62,31 @@ class HealthDataSourceWrapper implements HealthDataSource {
60 int dateRangeType, 62 int dateRangeType,
61 int startDate, { 63 int startDate, {
62 int? queryUserId, 64 int? queryUserId,
63 - }) { 65 + }) async {
  66 + final stopwatch = Stopwatch()..start();
64 HealthDataSource dataSource = remoteDataSource; 67 HealthDataSource dataSource = remoteDataSource;
65 if (queryUserId == null || _myUserId == queryUserId) { 68 if (queryUserId == null || _myUserId == queryUserId) {
66 dataSource = localDataSource; 69 dataSource = localDataSource;
67 } 70 }
  71 + final sourceName =
  72 + identical(dataSource, localDataSource) ? 'local' : 'remote';
  73 + _logHrvTrend(
  74 + 'wrapper_getHrvStatistics_start source=$sourceName '
  75 + 'dateRangeType=$dateRangeType startDate=$startDate '
  76 + 'queryUserId=$queryUserId myUserId=$_myUserId',
  77 + );
68 78
69 - return dataSource.getHrvStatistics( 79 + final result = await dataSource.getHrvStatistics(
70 dateRangeType, 80 dateRangeType,
71 startDate, 81 startDate,
72 queryUserId: queryUserId, 82 queryUserId: queryUserId,
73 ); 83 );
  84 + _logHrvTrend(
  85 + 'wrapper_getHrvStatistics_finish source=$sourceName '
  86 + 'success=${result is AppSuccess} '
  87 + 'elapsedMs=${stopwatch.elapsedMilliseconds}',
  88 + );
  89 + return result;
74 } 90 }
75 91
76 @override 92 @override
@@ -143,4 +159,8 @@ class HealthDataSourceWrapper implements HealthDataSource { @@ -143,4 +159,8 @@ class HealthDataSourceWrapper implements HealthDataSource {
143 159
144 return dataSource.getV2StressScore(queryUserId, intDate); 160 return dataSource.getV2StressScore(queryUserId, intDate);
145 } 161 }
  162 +
  163 + void _logHrvTrend(String message) {
  164 + debugPrint('$_hrvTrendLogMarker $message');
  165 + }
146 } 166 }
@@ -23,6 +23,7 @@ class LocalHealthDataSource implements HealthDataSource { @@ -23,6 +23,7 @@ class LocalHealthDataSource implements HealthDataSource {
23 static const int _ohosDefaultStandGoal = 12; 23 static const int _ohosDefaultStandGoal = 12;
24 static const int _ohosDefaultExerciseGoalSeconds = 30 * 60; 24 static const int _ohosDefaultExerciseGoalSeconds = 30 * 60;
25 static const int _ohosDefaultSleepTargetSeconds = 8 * 60 * 60; 25 static const int _ohosDefaultSleepTargetSeconds = 8 * 60 * 60;
  26 + static const String _hrvTrendLogMarker = '[OHOS_HRV_TREND_PROFILE]';
26 27
27 @override 28 @override
28 Future<AppResult<SleepStatisticsData>> getSleepStatistics( 29 Future<AppResult<SleepStatisticsData>> getSleepStatistics(
@@ -130,7 +131,12 @@ class LocalHealthDataSource implements HealthDataSource { @@ -130,7 +131,12 @@ class LocalHealthDataSource implements HealthDataSource {
130 int startDate, { 131 int startDate, {
131 int? queryUserId, 132 int? queryUserId,
132 }) async { 133 }) async {
  134 + final totalStopwatch = Stopwatch()..start();
133 try { 135 try {
  136 + _hrvTrendLog(
  137 + 'local_statistics_start dateRangeType=$dateRangeType '
  138 + 'startDate=$startDate queryUserId=$queryUserId',
  139 + );
134 final days = LocalHealthDataConvert.rangeDays(dateRangeType, startDate); 140 final days = LocalHealthDataConvert.rangeDays(dateRangeType, startDate);
135 if (days.isEmpty) return AppSuccess(HrvStatisticsDataV2()); 141 if (days.isEmpty) return AppSuccess(HrvStatisticsDataV2());
136 142
@@ -138,36 +144,84 @@ class LocalHealthDataSource implements HealthDataSource { @@ -138,36 +144,84 @@ class LocalHealthDataSource implements HealthDataSource {
138 dateRangeType, 144 dateRangeType,
139 startDate, 145 startDate,
140 ); 146 );
  147 + _hrvTrendLog(
  148 + 'local_statistics_range_finish dateRangeType=$dateRangeType '
  149 + 'days=${days.length} previousDays=${previousDays.length} '
  150 + 'elapsedMs=${totalStopwatch.elapsedMilliseconds}',
  151 + );
  152 + final hrvQueryStart = LocalHealthDataConvert.unixSeconds(days.first);
  153 + final hrvQueryEnd = LocalHealthDataConvert.unixSeconds(
  154 + days.last.add(const Duration(days: 1)),
  155 + );
  156 + final dailyQueryStart = LocalHealthDataConvert.dateKey(
  157 + previousDays.isEmpty ? days.first : previousDays.first,
  158 + );
  159 + final dailyQueryEnd = LocalHealthDataConvert.dateKey(days.last);
  160 +
  161 + final hrvStopwatch = Stopwatch()..start();
141 final hrvPoints = await coreService.queryHrvStressPoints( 162 final hrvPoints = await coreService.queryHrvStressPoints(
142 - startTime: LocalHealthDataConvert.unixSeconds(days.first),  
143 - endTime: LocalHealthDataConvert.unixSeconds(  
144 - days.last.add(const Duration(days: 1)),  
145 - ), 163 + startTime: hrvQueryStart,
  164 + endTime: hrvQueryEnd,
  165 + );
  166 + _hrvTrendLog(
  167 + 'local_query_hrv_results_finish startTime=$hrvQueryStart '
  168 + 'endTime=$hrvQueryEnd count=${hrvPoints.length} '
  169 + 'elapsedMs=${hrvStopwatch.elapsedMilliseconds}',
146 ); 170 );
  171 +
  172 + final dailyStopwatch = Stopwatch()..start();
147 final dailyStressPoints = await coreService.queryDailyStressPoints( 173 final dailyStressPoints = await coreService.queryDailyStressPoints(
148 - startDate: LocalHealthDataConvert.dateKey(  
149 - previousDays.isEmpty ? days.first : previousDays.first),  
150 - endDate: LocalHealthDataConvert.dateKey(days.last), 174 + startDate: dailyQueryStart,
  175 + endDate: dailyQueryEnd,
151 ); 176 );
  177 + _hrvTrendLog(
  178 + 'local_query_daily_stress_finish startDate=$dailyQueryStart '
  179 + 'endDate=$dailyQueryEnd count=${dailyStressPoints.length} '
  180 + 'elapsedMs=${dailyStopwatch.elapsedMilliseconds}',
  181 + );
  182 +
  183 + final restingHrStopwatch = Stopwatch()..start();
152 final restingHeartRate = await coreService.queryRawDataPoints( 184 final restingHeartRate = await coreService.queryRawDataPoints(
153 dataType: HealthDataUploadType.restingHeartRate.type, 185 dataType: HealthDataUploadType.restingHeartRate.type,
154 - startTime: LocalHealthDataConvert.unixSeconds(days.first),  
155 - endTime: LocalHealthDataConvert.unixSeconds(  
156 - days.last.add(const Duration(days: 1)),  
157 - ), 186 + startTime: hrvQueryStart,
  187 + endTime: hrvQueryEnd,
  188 + );
  189 + _hrvTrendLog(
  190 + 'local_query_resting_hr_finish dataType='
  191 + '${HealthDataUploadType.restingHeartRate.type} '
  192 + 'startTime=$hrvQueryStart endTime=$hrvQueryEnd '
  193 + 'count=${restingHeartRate.length} '
  194 + 'elapsedMs=${restingHrStopwatch.elapsedMilliseconds}',
158 ); 195 );
159 196
  197 + final convertStopwatch = Stopwatch()..start();
  198 + final statistics = LocalHealthDataConvert.hrvStatistics(
  199 + dateRangeType: dateRangeType,
  200 + days: days,
  201 + previousDays: previousDays,
  202 + hrvPoints: hrvPoints,
  203 + dailyStressPoints: dailyStressPoints,
  204 + restingHeartRate: restingHeartRate,
  205 + );
  206 + _hrvTrendLog(
  207 + 'local_convert_finish trendCount='
  208 + '${statistics.hrvTrendList?.length ?? 0} '
  209 + 'distributionCount=${statistics.hrvDistributionList?.length ?? 0} '
  210 + 'elapsedMs=${convertStopwatch.elapsedMilliseconds}',
  211 + );
  212 + _hrvTrendLog(
  213 + 'local_statistics_finish dateRangeType=$dateRangeType '
  214 + 'elapsedMs=${totalStopwatch.elapsedMilliseconds}',
  215 + );
160 return AppSuccess( 216 return AppSuccess(
161 - LocalHealthDataConvert.hrvStatistics(  
162 - dateRangeType: dateRangeType,  
163 - days: days,  
164 - previousDays: previousDays,  
165 - hrvPoints: hrvPoints,  
166 - dailyStressPoints: dailyStressPoints,  
167 - restingHeartRate: restingHeartRate,  
168 - ), 217 + statistics,
169 ); 218 );
170 } catch (error) { 219 } catch (error) {
  220 + _hrvTrendLog(
  221 + 'local_statistics_failed dateRangeType=$dateRangeType '
  222 + 'startDate=$startDate elapsedMs=${totalStopwatch.elapsedMilliseconds} '
  223 + 'error=$error',
  224 + );
171 return AppFailure(AppUnknownError(error)); 225 return AppFailure(AppUnknownError(error));
172 } 226 }
173 } 227 }
@@ -433,6 +487,10 @@ class LocalHealthDataSource implements HealthDataSource { @@ -433,6 +487,10 @@ class LocalHealthDataSource implements HealthDataSource {
433 487
434 bool get _isOhosPlatform => defaultTargetPlatform.name == 'ohos'; 488 bool get _isOhosPlatform => defaultTargetPlatform.name == 'ohos';
435 489
  490 + void _hrvTrendLog(String message) {
  491 + debugPrint('$_hrvTrendLogMarker $message');
  492 + }
  493 +
436 Future<List<HealthKitRawActivityDataPoint>> 494 Future<List<HealthKitRawActivityDataPoint>>
437 _resolveOhosActivityGoalsIfNeeded({ 495 _resolveOhosActivityGoalsIfNeeded({
438 required List<HealthKitRawActivityDataPoint> activity, 496 required List<HealthKitRawActivityDataPoint> activity,
@@ -6,7 +6,7 @@ packages: @@ -6,7 +6,7 @@ packages:
6 description: 6 description:
7 name: _fe_analyzer_shared 7 name: _fe_analyzer_shared
8 sha256: da0d9209ca76bde579f2da330aeb9df62b6319c834fa7baae052021b0462401f 8 sha256: da0d9209ca76bde579f2da330aeb9df62b6319c834fa7baae052021b0462401f
9 - url: "https://pub.flutter-io.cn" 9 + url: "https://pub.dev"
10 source: hosted 10 source: hosted
11 version: "85.0.0" 11 version: "85.0.0"
12 analyzer: 12 analyzer:
@@ -14,7 +14,7 @@ packages: @@ -14,7 +14,7 @@ packages:
14 description: 14 description:
15 name: analyzer 15 name: analyzer
16 sha256: "974859dc0ff5f37bc4313244b3218c791810d03ab3470a579580279ba971a48d" 16 sha256: "974859dc0ff5f37bc4313244b3218c791810d03ab3470a579580279ba971a48d"
17 - url: "https://pub.flutter-io.cn" 17 + url: "https://pub.dev"
18 source: hosted 18 source: hosted
19 version: "7.7.1" 19 version: "7.7.1"
20 archive: 20 archive:
@@ -22,7 +22,7 @@ packages: @@ -22,7 +22,7 @@ packages:
22 description: 22 description:
23 name: archive 23 name: archive
24 sha256: ace891da0862b0e4cabbb064ee3fd87b2728b898949fdb366d83fe98342c9f19 24 sha256: ace891da0862b0e4cabbb064ee3fd87b2728b898949fdb366d83fe98342c9f19
25 - url: "https://pub.flutter-io.cn" 25 + url: "https://pub.dev"
26 source: hosted 26 source: hosted
27 version: "4.2.0" 27 version: "4.2.0"
28 args: 28 args:
@@ -30,7 +30,7 @@ packages: @@ -30,7 +30,7 @@ packages:
30 description: 30 description:
31 name: args 31 name: args
32 sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 32 sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04
33 - url: "https://pub.flutter-io.cn" 33 + url: "https://pub.dev"
34 source: hosted 34 source: hosted
35 version: "2.7.0" 35 version: "2.7.0"
36 async: 36 async:
@@ -38,7 +38,7 @@ packages: @@ -38,7 +38,7 @@ packages:
38 description: 38 description:
39 name: async 39 name: async
40 sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" 40 sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
41 - url: "https://pub.flutter-io.cn" 41 + url: "https://pub.dev"
42 source: hosted 42 source: hosted
43 version: "2.11.0" 43 version: "2.11.0"
44 boolean_selector: 44 boolean_selector:
@@ -46,7 +46,7 @@ packages: @@ -46,7 +46,7 @@ packages:
46 description: 46 description:
47 name: boolean_selector 47 name: boolean_selector
48 sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" 48 sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
49 - url: "https://pub.flutter-io.cn" 49 + url: "https://pub.dev"
50 source: hosted 50 source: hosted
51 version: "2.1.1" 51 version: "2.1.1"
52 build: 52 build:
@@ -54,7 +54,7 @@ packages: @@ -54,7 +54,7 @@ packages:
54 description: 54 description:
55 name: build 55 name: build
56 sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0 56 sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0
57 - url: "https://pub.flutter-io.cn" 57 + url: "https://pub.dev"
58 source: hosted 58 source: hosted
59 version: "2.4.2" 59 version: "2.4.2"
60 build_config: 60 build_config:
@@ -62,7 +62,7 @@ packages: @@ -62,7 +62,7 @@ packages:
62 description: 62 description:
63 name: build_config 63 name: build_config
64 sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33" 64 sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33"
65 - url: "https://pub.flutter-io.cn" 65 + url: "https://pub.dev"
66 source: hosted 66 source: hosted
67 version: "1.1.2" 67 version: "1.1.2"
68 build_daemon: 68 build_daemon:
@@ -70,7 +70,7 @@ packages: @@ -70,7 +70,7 @@ packages:
70 description: 70 description:
71 name: build_daemon 71 name: build_daemon
72 sha256: "8e928697a82be082206edb0b9c99c5a4ad6bc31c9e9b8b2f291ae65cd4a25daa" 72 sha256: "8e928697a82be082206edb0b9c99c5a4ad6bc31c9e9b8b2f291ae65cd4a25daa"
73 - url: "https://pub.flutter-io.cn" 73 + url: "https://pub.dev"
74 source: hosted 74 source: hosted
75 version: "4.0.4" 75 version: "4.0.4"
76 build_resolvers: 76 build_resolvers:
@@ -78,7 +78,7 @@ packages: @@ -78,7 +78,7 @@ packages:
78 description: 78 description:
79 name: build_resolvers 79 name: build_resolvers
80 sha256: b9e4fda21d846e192628e7a4f6deda6888c36b5b69ba02ff291a01fd529140f0 80 sha256: b9e4fda21d846e192628e7a4f6deda6888c36b5b69ba02ff291a01fd529140f0
81 - url: "https://pub.flutter-io.cn" 81 + url: "https://pub.dev"
82 source: hosted 82 source: hosted
83 version: "2.4.4" 83 version: "2.4.4"
84 build_runner: 84 build_runner:
@@ -86,7 +86,7 @@ packages: @@ -86,7 +86,7 @@ packages:
86 description: 86 description:
87 name: build_runner 87 name: build_runner
88 sha256: "058fe9dce1de7d69c4b84fada934df3e0153dd000758c4d65964d0166779aa99" 88 sha256: "058fe9dce1de7d69c4b84fada934df3e0153dd000758c4d65964d0166779aa99"
89 - url: "https://pub.flutter-io.cn" 89 + url: "https://pub.dev"
90 source: hosted 90 source: hosted
91 version: "2.4.15" 91 version: "2.4.15"
92 build_runner_core: 92 build_runner_core:
@@ -94,7 +94,7 @@ packages: @@ -94,7 +94,7 @@ packages:
94 description: 94 description:
95 name: build_runner_core 95 name: build_runner_core
96 sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021" 96 sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021"
97 - url: "https://pub.flutter-io.cn" 97 + url: "https://pub.dev"
98 source: hosted 98 source: hosted
99 version: "8.0.0" 99 version: "8.0.0"
100 built_collection: 100 built_collection:
@@ -102,7 +102,7 @@ packages: @@ -102,7 +102,7 @@ packages:
102 description: 102 description:
103 name: built_collection 103 name: built_collection
104 sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" 104 sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100"
105 - url: "https://pub.flutter-io.cn" 105 + url: "https://pub.dev"
106 source: hosted 106 source: hosted
107 version: "5.1.1" 107 version: "5.1.1"
108 built_value: 108 built_value:
@@ -110,7 +110,7 @@ packages: @@ -110,7 +110,7 @@ packages:
110 description: 110 description:
111 name: built_value 111 name: built_value
112 sha256: f87ea98192116f7093cb214551ce1929caae0681fdba282b3d8b4462adee7bb7 112 sha256: f87ea98192116f7093cb214551ce1929caae0681fdba282b3d8b4462adee7bb7
113 - url: "https://pub.flutter-io.cn" 113 + url: "https://pub.dev"
114 source: hosted 114 source: hosted
115 version: "8.13.0" 115 version: "8.13.0"
116 cached_network_image: 116 cached_network_image:
@@ -118,7 +118,7 @@ packages: @@ -118,7 +118,7 @@ packages:
118 description: 118 description:
119 name: cached_network_image 119 name: cached_network_image
120 sha256: "7c1183e361e5c8b0a0f21a28401eecdbde252441106a9816400dd4c2b2424916" 120 sha256: "7c1183e361e5c8b0a0f21a28401eecdbde252441106a9816400dd4c2b2424916"
121 - url: "https://pub.flutter-io.cn" 121 + url: "https://pub.dev"
122 source: hosted 122 source: hosted
123 version: "3.4.1" 123 version: "3.4.1"
124 cached_network_image_platform_interface: 124 cached_network_image_platform_interface:
@@ -126,7 +126,7 @@ packages: @@ -126,7 +126,7 @@ packages:
126 description: 126 description:
127 name: cached_network_image_platform_interface 127 name: cached_network_image_platform_interface
128 sha256: "35814b016e37fbdc91f7ae18c8caf49ba5c88501813f73ce8a07027a395e2829" 128 sha256: "35814b016e37fbdc91f7ae18c8caf49ba5c88501813f73ce8a07027a395e2829"
129 - url: "https://pub.flutter-io.cn" 129 + url: "https://pub.dev"
130 source: hosted 130 source: hosted
131 version: "4.1.1" 131 version: "4.1.1"
132 cached_network_image_web: 132 cached_network_image_web:
@@ -134,7 +134,7 @@ packages: @@ -134,7 +134,7 @@ packages:
134 description: 134 description:
135 name: cached_network_image_web 135 name: cached_network_image_web
136 sha256: "980842f4e8e2535b8dbd3d5ca0b1f0ba66bf61d14cc3a17a9b4788a3685ba062" 136 sha256: "980842f4e8e2535b8dbd3d5ca0b1f0ba66bf61d14cc3a17a9b4788a3685ba062"
137 - url: "https://pub.flutter-io.cn" 137 + url: "https://pub.dev"
138 source: hosted 138 source: hosted
139 version: "1.3.1" 139 version: "1.3.1"
140 characters: 140 characters:
@@ -142,7 +142,7 @@ packages: @@ -142,7 +142,7 @@ packages:
142 description: 142 description:
143 name: characters 143 name: characters
144 sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" 144 sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
145 - url: "https://pub.flutter-io.cn" 145 + url: "https://pub.dev"
146 source: hosted 146 source: hosted
147 version: "1.3.0" 147 version: "1.3.0"
148 checked_yaml: 148 checked_yaml:
@@ -150,7 +150,7 @@ packages: @@ -150,7 +150,7 @@ packages:
150 description: 150 description:
151 name: checked_yaml 151 name: checked_yaml
152 sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff 152 sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff
153 - url: "https://pub.flutter-io.cn" 153 + url: "https://pub.dev"
154 source: hosted 154 source: hosted
155 version: "2.0.3" 155 version: "2.0.3"
156 clock: 156 clock:
@@ -158,7 +158,7 @@ packages: @@ -158,7 +158,7 @@ packages:
158 description: 158 description:
159 name: clock 159 name: clock
160 sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf 160 sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
161 - url: "https://pub.flutter-io.cn" 161 + url: "https://pub.dev"
162 source: hosted 162 source: hosted
163 version: "1.1.1" 163 version: "1.1.1"
164 code_builder: 164 code_builder:
@@ -166,7 +166,7 @@ packages: @@ -166,7 +166,7 @@ packages:
166 description: 166 description:
167 name: code_builder 167 name: code_builder
168 sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e" 168 sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e"
169 - url: "https://pub.flutter-io.cn" 169 + url: "https://pub.dev"
170 source: hosted 170 source: hosted
171 version: "4.10.1" 171 version: "4.10.1"
172 collection: 172 collection:
@@ -174,7 +174,7 @@ packages: @@ -174,7 +174,7 @@ packages:
174 description: 174 description:
175 name: collection 175 name: collection
176 sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf 176 sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf
177 - url: "https://pub.flutter-io.cn" 177 + url: "https://pub.dev"
178 source: hosted 178 source: hosted
179 version: "1.19.0" 179 version: "1.19.0"
180 convert: 180 convert:
@@ -182,7 +182,7 @@ packages: @@ -182,7 +182,7 @@ packages:
182 description: 182 description:
183 name: convert 183 name: convert
184 sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 184 sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68
185 - url: "https://pub.flutter-io.cn" 185 + url: "https://pub.dev"
186 source: hosted 186 source: hosted
187 version: "3.1.2" 187 version: "3.1.2"
188 cross_file: 188 cross_file:
@@ -190,7 +190,7 @@ packages: @@ -190,7 +190,7 @@ packages:
190 description: 190 description:
191 name: cross_file 191 name: cross_file
192 sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" 192 sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670"
193 - url: "https://pub.flutter-io.cn" 193 + url: "https://pub.dev"
194 source: hosted 194 source: hosted
195 version: "0.3.4+2" 195 version: "0.3.4+2"
196 crypto: 196 crypto:
@@ -198,7 +198,7 @@ packages: @@ -198,7 +198,7 @@ packages:
198 description: 198 description:
199 name: crypto 199 name: crypto
200 sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf 200 sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf
201 - url: "https://pub.flutter-io.cn" 201 + url: "https://pub.dev"
202 source: hosted 202 source: hosted
203 version: "3.0.7" 203 version: "3.0.7"
204 cupertino_icons: 204 cupertino_icons:
@@ -206,7 +206,7 @@ packages: @@ -206,7 +206,7 @@ packages:
206 description: 206 description:
207 name: cupertino_icons 207 name: cupertino_icons
208 sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 208 sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6
209 - url: "https://pub.flutter-io.cn" 209 + url: "https://pub.dev"
210 source: hosted 210 source: hosted
211 version: "1.0.8" 211 version: "1.0.8"
212 dart_style: 212 dart_style:
@@ -214,7 +214,7 @@ packages: @@ -214,7 +214,7 @@ packages:
214 description: 214 description:
215 name: dart_style 215 name: dart_style
216 sha256: "27eb0ae77836989a3bc541ce55595e8ceee0992807f14511552a898ddd0d88ac" 216 sha256: "27eb0ae77836989a3bc541ce55595e8ceee0992807f14511552a898ddd0d88ac"
217 - url: "https://pub.flutter-io.cn" 217 + url: "https://pub.dev"
218 source: hosted 218 source: hosted
219 version: "3.0.1" 219 version: "3.0.1"
220 dio: 220 dio:
@@ -222,7 +222,7 @@ packages: @@ -222,7 +222,7 @@ packages:
222 description: 222 description:
223 name: dio 223 name: dio
224 sha256: "852ec3b48cc431ac04fff978413c541502b67ffc3e26921e74e3d994694192c1" 224 sha256: "852ec3b48cc431ac04fff978413c541502b67ffc3e26921e74e3d994694192c1"
225 - url: "https://pub.flutter-io.cn" 225 + url: "https://pub.dev"
226 source: hosted 226 source: hosted
227 version: "5.11.1" 227 version: "5.11.1"
228 dio_web_adapter: 228 dio_web_adapter:
@@ -230,7 +230,7 @@ packages: @@ -230,7 +230,7 @@ packages:
230 description: 230 description:
231 name: dio_web_adapter 231 name: dio_web_adapter
232 sha256: "3a1b2cd7be71086f38504956e3ebcd2837288d231ff454bafa78021244102bfc" 232 sha256: "3a1b2cd7be71086f38504956e3ebcd2837288d231ff454bafa78021244102bfc"
233 - url: "https://pub.flutter-io.cn" 233 + url: "https://pub.dev"
234 source: hosted 234 source: hosted
235 version: "2.2.2" 235 version: "2.2.2"
236 equatable: 236 equatable:
@@ -238,7 +238,7 @@ packages: @@ -238,7 +238,7 @@ packages:
238 description: 238 description:
239 name: equatable 239 name: equatable
240 sha256: "3bce007a596ff8b3119c45d68aaef631272537c03d30e5d4534dd24bf4c5eaa2" 240 sha256: "3bce007a596ff8b3119c45d68aaef631272537c03d30e5d4534dd24bf4c5eaa2"
241 - url: "https://pub.flutter-io.cn" 241 + url: "https://pub.dev"
242 source: hosted 242 source: hosted
243 version: "2.1.0" 243 version: "2.1.0"
244 fake_async: 244 fake_async:
@@ -246,7 +246,7 @@ packages: @@ -246,7 +246,7 @@ packages:
246 description: 246 description:
247 name: fake_async 247 name: fake_async
248 sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" 248 sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
249 - url: "https://pub.flutter-io.cn" 249 + url: "https://pub.dev"
250 source: hosted 250 source: hosted
251 version: "1.3.1" 251 version: "1.3.1"
252 ffi: 252 ffi:
@@ -254,7 +254,7 @@ packages: @@ -254,7 +254,7 @@ packages:
254 description: 254 description:
255 name: ffi 255 name: ffi
256 sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" 256 sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6"
257 - url: "https://pub.flutter-io.cn" 257 + url: "https://pub.dev"
258 source: hosted 258 source: hosted
259 version: "2.1.3" 259 version: "2.1.3"
260 file: 260 file:
@@ -262,7 +262,7 @@ packages: @@ -262,7 +262,7 @@ packages:
262 description: 262 description:
263 name: file 263 name: file
264 sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 264 sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4
265 - url: "https://pub.flutter-io.cn" 265 + url: "https://pub.dev"
266 source: hosted 266 source: hosted
267 version: "7.0.1" 267 version: "7.0.1"
268 file_selector_linux: 268 file_selector_linux:
@@ -270,7 +270,7 @@ packages: @@ -270,7 +270,7 @@ packages:
270 description: 270 description:
271 name: file_selector_linux 271 name: file_selector_linux
272 sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33" 272 sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33"
273 - url: "https://pub.flutter-io.cn" 273 + url: "https://pub.dev"
274 source: hosted 274 source: hosted
275 version: "0.9.3+2" 275 version: "0.9.3+2"
276 file_selector_macos: 276 file_selector_macos:
@@ -278,7 +278,7 @@ packages: @@ -278,7 +278,7 @@ packages:
278 description: 278 description:
279 name: file_selector_macos 279 name: file_selector_macos
280 sha256: "8c9250b2bd2d8d4268e39c82543bacbaca0fda7d29e0728c3c4bbb7c820fd711" 280 sha256: "8c9250b2bd2d8d4268e39c82543bacbaca0fda7d29e0728c3c4bbb7c820fd711"
281 - url: "https://pub.flutter-io.cn" 281 + url: "https://pub.dev"
282 source: hosted 282 source: hosted
283 version: "0.9.4+3" 283 version: "0.9.4+3"
284 file_selector_platform_interface: 284 file_selector_platform_interface:
@@ -286,7 +286,7 @@ packages: @@ -286,7 +286,7 @@ packages:
286 description: 286 description:
287 name: file_selector_platform_interface 287 name: file_selector_platform_interface
288 sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b 288 sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b
289 - url: "https://pub.flutter-io.cn" 289 + url: "https://pub.dev"
290 source: hosted 290 source: hosted
291 version: "2.6.2" 291 version: "2.6.2"
292 file_selector_windows: 292 file_selector_windows:
@@ -294,7 +294,7 @@ packages: @@ -294,7 +294,7 @@ packages:
294 description: 294 description:
295 name: file_selector_windows 295 name: file_selector_windows
296 sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b" 296 sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b"
297 - url: "https://pub.flutter-io.cn" 297 + url: "https://pub.dev"
298 source: hosted 298 source: hosted
299 version: "0.9.3+4" 299 version: "0.9.3+4"
300 fixnum: 300 fixnum:
@@ -302,7 +302,7 @@ packages: @@ -302,7 +302,7 @@ packages:
302 description: 302 description:
303 name: fixnum 303 name: fixnum
304 sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be 304 sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be
305 - url: "https://pub.flutter-io.cn" 305 + url: "https://pub.dev"
306 source: hosted 306 source: hosted
307 version: "1.1.1" 307 version: "1.1.1"
308 fl_chart: 308 fl_chart:
@@ -310,7 +310,7 @@ packages: @@ -310,7 +310,7 @@ packages:
310 description: 310 description:
311 name: fl_chart 311 name: fl_chart
312 sha256: "5276944c6ffc975ae796569a826c38a62d2abcf264e26b88fa6f482e107f4237" 312 sha256: "5276944c6ffc975ae796569a826c38a62d2abcf264e26b88fa6f482e107f4237"
313 - url: "https://pub.flutter-io.cn" 313 + url: "https://pub.dev"
314 source: hosted 314 source: hosted
315 version: "0.70.2" 315 version: "0.70.2"
316 flutter: 316 flutter:
@@ -323,7 +323,7 @@ packages: @@ -323,7 +323,7 @@ packages:
323 description: 323 description:
324 name: flutter_cache_manager 324 name: flutter_cache_manager
325 sha256: "400b6592f16a4409a7f2bb929a9a7e38c72cceb8ffb99ee57bbf2cb2cecf8386" 325 sha256: "400b6592f16a4409a7f2bb929a9a7e38c72cceb8ffb99ee57bbf2cb2cecf8386"
326 - url: "https://pub.flutter-io.cn" 326 + url: "https://pub.dev"
327 source: hosted 327 source: hosted
328 version: "3.4.1" 328 version: "3.4.1"
329 flutter_lints: 329 flutter_lints:
@@ -331,7 +331,7 @@ packages: @@ -331,7 +331,7 @@ packages:
331 description: 331 description:
332 name: flutter_lints 332 name: flutter_lints
333 sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" 333 sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1"
334 - url: "https://pub.flutter-io.cn" 334 + url: "https://pub.dev"
335 source: hosted 335 source: hosted
336 version: "5.0.0" 336 version: "5.0.0"
337 flutter_localizations: 337 flutter_localizations:
@@ -344,7 +344,7 @@ packages: @@ -344,7 +344,7 @@ packages:
344 description: 344 description:
345 name: flutter_plugin_android_lifecycle 345 name: flutter_plugin_android_lifecycle
346 sha256: "6382ce712ff69b0f719640ce957559dde459e55ecd433c767e06d139ddf16cab" 346 sha256: "6382ce712ff69b0f719640ce957559dde459e55ecd433c767e06d139ddf16cab"
347 - url: "https://pub.flutter-io.cn" 347 + url: "https://pub.dev"
348 source: hosted 348 source: hosted
349 version: "2.0.29" 349 version: "2.0.29"
350 flutter_test: 350 flutter_test:
@@ -357,7 +357,7 @@ packages: @@ -357,7 +357,7 @@ packages:
357 description: 357 description:
358 name: flutter_timezone 358 name: flutter_timezone
359 sha256: "869677426fde92dbe170fb7d2d4929f2a8343c2f5f62f08b0bb64f908630b073" 359 sha256: "869677426fde92dbe170fb7d2d4929f2a8343c2f5f62f08b0bb64f908630b073"
360 - url: "https://pub.flutter-io.cn" 360 + url: "https://pub.dev"
361 source: hosted 361 source: hosted
362 version: "5.1.0" 362 version: "5.1.0"
363 flutter_web_plugins: 363 flutter_web_plugins:
@@ -379,7 +379,7 @@ packages: @@ -379,7 +379,7 @@ packages:
379 description: 379 description:
380 name: frontend_server_client 380 name: frontend_server_client
381 sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 381 sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694
382 - url: "https://pub.flutter-io.cn" 382 + url: "https://pub.dev"
383 source: hosted 383 source: hosted
384 version: "4.0.0" 384 version: "4.0.0"
385 get: 385 get:
@@ -387,7 +387,7 @@ packages: @@ -387,7 +387,7 @@ packages:
387 description: 387 description:
388 name: get 388 name: get
389 sha256: "5ed34a7925b85336e15d472cc4cfe7d9ebf4ab8e8b9f688585bf6b50f4c3d79a" 389 sha256: "5ed34a7925b85336e15d472cc4cfe7d9ebf4ab8e8b9f688585bf6b50f4c3d79a"
390 - url: "https://pub.flutter-io.cn" 390 + url: "https://pub.dev"
391 source: hosted 391 source: hosted
392 version: "4.7.3" 392 version: "4.7.3"
393 glob: 393 glob:
@@ -395,7 +395,7 @@ packages: @@ -395,7 +395,7 @@ packages:
395 description: 395 description:
396 name: glob 396 name: glob
397 sha256: "218aeb56050c714f62a3182775320dfa04602b55074873e24e31bbd39bda96fb" 397 sha256: "218aeb56050c714f62a3182775320dfa04602b55074873e24e31bbd39bda96fb"
398 - url: "https://pub.flutter-io.cn" 398 + url: "https://pub.dev"
399 source: hosted 399 source: hosted
400 version: "2.2.0" 400 version: "2.2.0"
401 graphs: 401 graphs:
@@ -403,7 +403,7 @@ packages: @@ -403,7 +403,7 @@ packages:
403 description: 403 description:
404 name: graphs 404 name: graphs
405 sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" 405 sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0"
406 - url: "https://pub.flutter-io.cn" 406 + url: "https://pub.dev"
407 source: hosted 407 source: hosted
408 version: "2.3.2" 408 version: "2.3.2"
409 http: 409 http:
@@ -411,7 +411,7 @@ packages: @@ -411,7 +411,7 @@ packages:
411 description: 411 description:
412 name: http 412 name: http
413 sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" 413 sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412"
414 - url: "https://pub.flutter-io.cn" 414 + url: "https://pub.dev"
415 source: hosted 415 source: hosted
416 version: "1.6.0" 416 version: "1.6.0"
417 http_multi_server: 417 http_multi_server:
@@ -419,7 +419,7 @@ packages: @@ -419,7 +419,7 @@ packages:
419 description: 419 description:
420 name: http_multi_server 420 name: http_multi_server
421 sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 421 sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8
422 - url: "https://pub.flutter-io.cn" 422 + url: "https://pub.dev"
423 source: hosted 423 source: hosted
424 version: "3.2.2" 424 version: "3.2.2"
425 http_parser: 425 http_parser:
@@ -427,7 +427,7 @@ packages: @@ -427,7 +427,7 @@ packages:
427 description: 427 description:
428 name: http_parser 428 name: http_parser
429 sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" 429 sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
430 - url: "https://pub.flutter-io.cn" 430 + url: "https://pub.dev"
431 source: hosted 431 source: hosted
432 version: "4.1.2" 432 version: "4.1.2"
433 image_cropper: 433 image_cropper:
@@ -471,7 +471,7 @@ packages: @@ -471,7 +471,7 @@ packages:
471 description: 471 description:
472 name: image_picker_android 472 name: image_picker_android
473 sha256: e83b2b05141469c5e19d77e1dfa11096b6b1567d09065b2265d7c6904560050c 473 sha256: e83b2b05141469c5e19d77e1dfa11096b6b1567d09065b2265d7c6904560050c
474 - url: "https://pub.flutter-io.cn" 474 + url: "https://pub.dev"
475 source: hosted 475 source: hosted
476 version: "0.8.13" 476 version: "0.8.13"
477 image_picker_for_web: 477 image_picker_for_web:
@@ -479,7 +479,7 @@ packages: @@ -479,7 +479,7 @@ packages:
479 description: 479 description:
480 name: image_picker_for_web 480 name: image_picker_for_web
481 sha256: "40c2a6a0da15556dc0f8e38a3246064a971a9f512386c3339b89f76db87269b6" 481 sha256: "40c2a6a0da15556dc0f8e38a3246064a971a9f512386c3339b89f76db87269b6"
482 - url: "https://pub.flutter-io.cn" 482 + url: "https://pub.dev"
483 source: hosted 483 source: hosted
484 version: "3.1.0" 484 version: "3.1.0"
485 image_picker_ios: 485 image_picker_ios:
@@ -487,7 +487,7 @@ packages: @@ -487,7 +487,7 @@ packages:
487 description: 487 description:
488 name: image_picker_ios 488 name: image_picker_ios
489 sha256: eb06fe30bab4c4497bad449b66448f50edcc695f1c59408e78aa3a8059eb8f0e 489 sha256: eb06fe30bab4c4497bad449b66448f50edcc695f1c59408e78aa3a8059eb8f0e
490 - url: "https://pub.flutter-io.cn" 490 + url: "https://pub.dev"
491 source: hosted 491 source: hosted
492 version: "0.8.13" 492 version: "0.8.13"
493 image_picker_linux: 493 image_picker_linux:
@@ -495,7 +495,7 @@ packages: @@ -495,7 +495,7 @@ packages:
495 description: 495 description:
496 name: image_picker_linux 496 name: image_picker_linux
497 sha256: "1f81c5f2046b9ab724f85523e4af65be1d47b038160a8c8deed909762c308ed4" 497 sha256: "1f81c5f2046b9ab724f85523e4af65be1d47b038160a8c8deed909762c308ed4"
498 - url: "https://pub.flutter-io.cn" 498 + url: "https://pub.dev"
499 source: hosted 499 source: hosted
500 version: "0.2.2" 500 version: "0.2.2"
501 image_picker_macos: 501 image_picker_macos:
@@ -503,7 +503,7 @@ packages: @@ -503,7 +503,7 @@ packages:
503 description: 503 description:
504 name: image_picker_macos 504 name: image_picker_macos
505 sha256: d58cd9d67793d52beefd6585b12050af0a7663c0c2a6ece0fb110a35d6955e04 505 sha256: d58cd9d67793d52beefd6585b12050af0a7663c0c2a6ece0fb110a35d6955e04
506 - url: "https://pub.flutter-io.cn" 506 + url: "https://pub.dev"
507 source: hosted 507 source: hosted
508 version: "0.2.2" 508 version: "0.2.2"
509 image_picker_ohos: 509 image_picker_ohos:
@@ -520,7 +520,7 @@ packages: @@ -520,7 +520,7 @@ packages:
520 description: 520 description:
521 name: image_picker_platform_interface 521 name: image_picker_platform_interface
522 sha256: "9f143b0dba3e459553209e20cc425c9801af48e6dfa4f01a0fcf927be3f41665" 522 sha256: "9f143b0dba3e459553209e20cc425c9801af48e6dfa4f01a0fcf927be3f41665"
523 - url: "https://pub.flutter-io.cn" 523 + url: "https://pub.dev"
524 source: hosted 524 source: hosted
525 version: "2.11.0" 525 version: "2.11.0"
526 image_picker_windows: 526 image_picker_windows:
@@ -528,7 +528,7 @@ packages: @@ -528,7 +528,7 @@ packages:
528 description: 528 description:
529 name: image_picker_windows 529 name: image_picker_windows
530 sha256: d248c86554a72b5495a31c56f060cf73a41c7ff541689327b1a7dbccc33adfae 530 sha256: d248c86554a72b5495a31c56f060cf73a41c7ff541689327b1a7dbccc33adfae
531 - url: "https://pub.flutter-io.cn" 531 + url: "https://pub.dev"
532 source: hosted 532 source: hosted
533 version: "0.2.2" 533 version: "0.2.2"
534 intl: 534 intl:
@@ -536,7 +536,7 @@ packages: @@ -536,7 +536,7 @@ packages:
536 description: 536 description:
537 name: intl 537 name: intl
538 sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf 538 sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf
539 - url: "https://pub.flutter-io.cn" 539 + url: "https://pub.dev"
540 source: hosted 540 source: hosted
541 version: "0.19.0" 541 version: "0.19.0"
542 io: 542 io:
@@ -544,7 +544,7 @@ packages: @@ -544,7 +544,7 @@ packages:
544 description: 544 description:
545 name: io 545 name: io
546 sha256: "2635216ca6a737e60de577ffa1a48a0bec76ca8a62917cfc1bb88c14c570646f" 546 sha256: "2635216ca6a737e60de577ffa1a48a0bec76ca8a62917cfc1bb88c14c570646f"
547 - url: "https://pub.flutter-io.cn" 547 + url: "https://pub.dev"
548 source: hosted 548 source: hosted
549 version: "1.1.0" 549 version: "1.1.0"
550 js: 550 js:
@@ -552,7 +552,7 @@ packages: @@ -552,7 +552,7 @@ packages:
552 description: 552 description:
553 name: js 553 name: js
554 sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf 554 sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf
555 - url: "https://pub.flutter-io.cn" 555 + url: "https://pub.dev"
556 source: hosted 556 source: hosted
557 version: "0.7.1" 557 version: "0.7.1"
558 json_annotation: 558 json_annotation:
@@ -560,7 +560,7 @@ packages: @@ -560,7 +560,7 @@ packages:
560 description: 560 description:
561 name: json_annotation 561 name: json_annotation
562 sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" 562 sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1"
563 - url: "https://pub.flutter-io.cn" 563 + url: "https://pub.dev"
564 source: hosted 564 source: hosted
565 version: "4.9.0" 565 version: "4.9.0"
566 leak_tracker: 566 leak_tracker:
@@ -568,7 +568,7 @@ packages: @@ -568,7 +568,7 @@ packages:
568 description: 568 description:
569 name: leak_tracker 569 name: leak_tracker
570 sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" 570 sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06"
571 - url: "https://pub.flutter-io.cn" 571 + url: "https://pub.dev"
572 source: hosted 572 source: hosted
573 version: "10.0.7" 573 version: "10.0.7"
574 leak_tracker_flutter_testing: 574 leak_tracker_flutter_testing:
@@ -576,7 +576,7 @@ packages: @@ -576,7 +576,7 @@ packages:
576 description: 576 description:
577 name: leak_tracker_flutter_testing 577 name: leak_tracker_flutter_testing
578 sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" 578 sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379"
579 - url: "https://pub.flutter-io.cn" 579 + url: "https://pub.dev"
580 source: hosted 580 source: hosted
581 version: "3.0.8" 581 version: "3.0.8"
582 leak_tracker_testing: 582 leak_tracker_testing:
@@ -584,7 +584,7 @@ packages: @@ -584,7 +584,7 @@ packages:
584 description: 584 description:
585 name: leak_tracker_testing 585 name: leak_tracker_testing
586 sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" 586 sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
587 - url: "https://pub.flutter-io.cn" 587 + url: "https://pub.dev"
588 source: hosted 588 source: hosted
589 version: "3.0.1" 589 version: "3.0.1"
590 lints: 590 lints:
@@ -592,23 +592,23 @@ packages: @@ -592,23 +592,23 @@ packages:
592 description: 592 description:
593 name: lints 593 name: lints
594 sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 594 sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7
595 - url: "https://pub.flutter-io.cn" 595 + url: "https://pub.dev"
596 source: hosted 596 source: hosted
597 version: "5.1.1" 597 version: "5.1.1"
598 logger: 598 logger:
599 dependency: "direct main" 599 dependency: "direct main"
600 description: 600 description:
601 name: logger 601 name: logger
602 - sha256: "25aee487596a6257655a1e091ec2ae66bc30e7af663592cc3a27e6591e05035c"  
603 - url: "https://pub.flutter-io.cn" 602 + sha256: "2a0dc097e7b01d942475bdd552356db2d0f768b05540bd4b2b53f1840f2239a7"
  603 + url: "https://pub.dev"
604 source: hosted 604 source: hosted
605 - version: "2.7.0" 605 + version: "2.8.0"
606 logging: 606 logging:
607 dependency: transitive 607 dependency: transitive
608 description: 608 description:
609 name: logging 609 name: logging
610 sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 610 sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61
611 - url: "https://pub.flutter-io.cn" 611 + url: "https://pub.dev"
612 source: hosted 612 source: hosted
613 version: "1.3.0" 613 version: "1.3.0"
614 lottie: 614 lottie:
@@ -616,7 +616,7 @@ packages: @@ -616,7 +616,7 @@ packages:
616 description: 616 description:
617 name: lottie 617 name: lottie
618 sha256: c5fa04a80a620066c15cf19cc44773e19e9b38e989ff23ea32e5903ef1015950 618 sha256: c5fa04a80a620066c15cf19cc44773e19e9b38e989ff23ea32e5903ef1015950
619 - url: "https://pub.flutter-io.cn" 619 + url: "https://pub.dev"
620 source: hosted 620 source: hosted
621 version: "3.3.1" 621 version: "3.3.1"
622 matcher: 622 matcher:
@@ -624,7 +624,7 @@ packages: @@ -624,7 +624,7 @@ packages:
624 description: 624 description:
625 name: matcher 625 name: matcher
626 sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb 626 sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
627 - url: "https://pub.flutter-io.cn" 627 + url: "https://pub.dev"
628 source: hosted 628 source: hosted
629 version: "0.12.16+1" 629 version: "0.12.16+1"
630 material_color_utilities: 630 material_color_utilities:
@@ -632,7 +632,7 @@ packages: @@ -632,7 +632,7 @@ packages:
632 description: 632 description:
633 name: material_color_utilities 633 name: material_color_utilities
634 sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec 634 sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
635 - url: "https://pub.flutter-io.cn" 635 + url: "https://pub.dev"
636 source: hosted 636 source: hosted
637 version: "0.11.1" 637 version: "0.11.1"
638 meta: 638 meta:
@@ -640,7 +640,7 @@ packages: @@ -640,7 +640,7 @@ packages:
640 description: 640 description:
641 name: meta 641 name: meta
642 sha256: "307249ce4ff29d58a18e97f6345f539382eb9c9c29ecda628900f31de0443dd9" 642 sha256: "307249ce4ff29d58a18e97f6345f539382eb9c9c29ecda628900f31de0443dd9"
643 - url: "https://pub.flutter-io.cn" 643 + url: "https://pub.dev"
644 source: hosted 644 source: hosted
645 version: "1.19.0" 645 version: "1.19.0"
646 mime: 646 mime:
@@ -648,7 +648,7 @@ packages: @@ -648,7 +648,7 @@ packages:
648 description: 648 description:
649 name: mime 649 name: mime
650 sha256: bd47de35f07e27267e69c8c8b22edf9473bfee170a60d60fcc93730c5144b7f6 650 sha256: bd47de35f07e27267e69c8c8b22edf9473bfee170a60d60fcc93730c5144b7f6
651 - url: "https://pub.flutter-io.cn" 651 + url: "https://pub.dev"
652 source: hosted 652 source: hosted
653 version: "2.1.0" 653 version: "2.1.0"
654 octo_image: 654 octo_image:
@@ -656,7 +656,7 @@ packages: @@ -656,7 +656,7 @@ packages:
656 description: 656 description:
657 name: octo_image 657 name: octo_image
658 sha256: "34faa6639a78c7e3cbe79be6f9f96535867e879748ade7d17c9b1ae7536293bd" 658 sha256: "34faa6639a78c7e3cbe79be6f9f96535867e879748ade7d17c9b1ae7536293bd"
659 - url: "https://pub.flutter-io.cn" 659 + url: "https://pub.dev"
660 source: hosted 660 source: hosted
661 version: "2.1.0" 661 version: "2.1.0"
662 package_config: 662 package_config:
@@ -664,7 +664,7 @@ packages: @@ -664,7 +664,7 @@ packages:
664 description: 664 description:
665 name: package_config 665 name: package_config
666 sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc 666 sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc
667 - url: "https://pub.flutter-io.cn" 667 + url: "https://pub.dev"
668 source: hosted 668 source: hosted
669 version: "2.2.0" 669 version: "2.2.0"
670 path: 670 path:
@@ -672,7 +672,7 @@ packages: @@ -672,7 +672,7 @@ packages:
672 description: 672 description:
673 name: path 673 name: path
674 sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" 674 sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
675 - url: "https://pub.flutter-io.cn" 675 + url: "https://pub.dev"
676 source: hosted 676 source: hosted
677 version: "1.9.0" 677 version: "1.9.0"
678 path_provider: 678 path_provider:
@@ -689,7 +689,7 @@ packages: @@ -689,7 +689,7 @@ packages:
689 description: 689 description:
690 name: path_provider_android 690 name: path_provider_android
691 sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9 691 sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9
692 - url: "https://pub.flutter-io.cn" 692 + url: "https://pub.dev"
693 source: hosted 693 source: hosted
694 version: "2.2.17" 694 version: "2.2.17"
695 path_provider_foundation: 695 path_provider_foundation:
@@ -697,7 +697,7 @@ packages: @@ -697,7 +697,7 @@ packages:
697 description: 697 description:
698 name: path_provider_foundation 698 name: path_provider_foundation
699 sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" 699 sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942"
700 - url: "https://pub.flutter-io.cn" 700 + url: "https://pub.dev"
701 source: hosted 701 source: hosted
702 version: "2.4.1" 702 version: "2.4.1"
703 path_provider_linux: 703 path_provider_linux:
@@ -705,7 +705,7 @@ packages: @@ -705,7 +705,7 @@ packages:
705 description: 705 description:
706 name: path_provider_linux 706 name: path_provider_linux
707 sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 707 sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
708 - url: "https://pub.flutter-io.cn" 708 + url: "https://pub.dev"
709 source: hosted 709 source: hosted
710 version: "2.2.1" 710 version: "2.2.1"
711 path_provider_ohos: 711 path_provider_ohos:
@@ -722,7 +722,7 @@ packages: @@ -722,7 +722,7 @@ packages:
722 description: 722 description:
723 name: path_provider_platform_interface 723 name: path_provider_platform_interface
724 sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" 724 sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334"
725 - url: "https://pub.flutter-io.cn" 725 + url: "https://pub.dev"
726 source: hosted 726 source: hosted
727 version: "2.1.2" 727 version: "2.1.2"
728 path_provider_windows: 728 path_provider_windows:
@@ -730,7 +730,7 @@ packages: @@ -730,7 +730,7 @@ packages:
730 description: 730 description:
731 name: path_provider_windows 731 name: path_provider_windows
732 sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 732 sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7
733 - url: "https://pub.flutter-io.cn" 733 + url: "https://pub.dev"
734 source: hosted 734 source: hosted
735 version: "2.3.0" 735 version: "2.3.0"
736 permission_handler: 736 permission_handler:
@@ -738,7 +738,7 @@ packages: @@ -738,7 +738,7 @@ packages:
738 description: 738 description:
739 name: permission_handler 739 name: permission_handler
740 sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849" 740 sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849"
741 - url: "https://pub.flutter-io.cn" 741 + url: "https://pub.dev"
742 source: hosted 742 source: hosted
743 version: "11.4.0" 743 version: "11.4.0"
744 permission_handler_android: 744 permission_handler_android:
@@ -746,7 +746,7 @@ packages: @@ -746,7 +746,7 @@ packages:
746 description: 746 description:
747 name: permission_handler_android 747 name: permission_handler_android
748 sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc 748 sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc
749 - url: "https://pub.flutter-io.cn" 749 + url: "https://pub.dev"
750 source: hosted 750 source: hosted
751 version: "12.1.0" 751 version: "12.1.0"
752 permission_handler_apple: 752 permission_handler_apple:
@@ -754,7 +754,7 @@ packages: @@ -754,7 +754,7 @@ packages:
754 description: 754 description:
755 name: permission_handler_apple 755 name: permission_handler_apple
756 sha256: f49cb15a064ea9d974fc7fbb302099353b7b170d07284e86e264561579e5bcf8 756 sha256: f49cb15a064ea9d974fc7fbb302099353b7b170d07284e86e264561579e5bcf8
757 - url: "https://pub.flutter-io.cn" 757 + url: "https://pub.dev"
758 source: hosted 758 source: hosted
759 version: "9.6.1" 759 version: "9.6.1"
760 permission_handler_html: 760 permission_handler_html:
@@ -762,7 +762,7 @@ packages: @@ -762,7 +762,7 @@ packages:
762 description: 762 description:
763 name: permission_handler_html 763 name: permission_handler_html
764 sha256: "6ea98b3f17f60d3b527f2647ed2ab4dc0f6bfe25b22cb1c363f5d8f62252f6ac" 764 sha256: "6ea98b3f17f60d3b527f2647ed2ab4dc0f6bfe25b22cb1c363f5d8f62252f6ac"
765 - url: "https://pub.flutter-io.cn" 765 + url: "https://pub.dev"
766 source: hosted 766 source: hosted
767 version: "0.1.4+1" 767 version: "0.1.4+1"
768 permission_handler_ohos: 768 permission_handler_ohos:
@@ -778,16 +778,16 @@ packages: @@ -778,16 +778,16 @@ packages:
778 dependency: transitive 778 dependency: transitive
779 description: 779 description:
780 name: permission_handler_platform_interface 780 name: permission_handler_platform_interface
781 - sha256: a5c8a97ecf5616112a5b16d4b8e9ec0e5ae90ef63ac69c0d7b8ae240be760b23  
782 - url: "https://pub.flutter-io.cn" 781 + sha256: ed86a61c190258fdd65de395ea0632822e3415c1faec38eae0c31b479c28a531
  782 + url: "https://pub.dev"
783 source: hosted 783 source: hosted
784 - version: "4.4.0" 784 + version: "4.4.1"
785 permission_handler_windows: 785 permission_handler_windows:
786 dependency: transitive 786 dependency: transitive
787 description: 787 description:
788 name: permission_handler_windows 788 name: permission_handler_windows
789 sha256: caeae01858a0a7d2df67a445ac98e1ad95e55a0e77c73044f4e9b1c8c2289cbd 789 sha256: caeae01858a0a7d2df67a445ac98e1ad95e55a0e77c73044f4e9b1c8c2289cbd
790 - url: "https://pub.flutter-io.cn" 790 + url: "https://pub.dev"
791 source: hosted 791 source: hosted
792 version: "0.2.2" 792 version: "0.2.2"
793 pigeon: 793 pigeon:
@@ -804,7 +804,7 @@ packages: @@ -804,7 +804,7 @@ packages:
804 description: 804 description:
805 name: platform 805 name: platform
806 sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" 806 sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984"
807 - url: "https://pub.flutter-io.cn" 807 + url: "https://pub.dev"
808 source: hosted 808 source: hosted
809 version: "3.1.6" 809 version: "3.1.6"
810 plugin_platform_interface: 810 plugin_platform_interface:
@@ -812,7 +812,7 @@ packages: @@ -812,7 +812,7 @@ packages:
812 description: 812 description:
813 name: plugin_platform_interface 813 name: plugin_platform_interface
814 sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" 814 sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
815 - url: "https://pub.flutter-io.cn" 815 + url: "https://pub.dev"
816 source: hosted 816 source: hosted
817 version: "2.1.8" 817 version: "2.1.8"
818 pool: 818 pool:
@@ -820,7 +820,7 @@ packages: @@ -820,7 +820,7 @@ packages:
820 description: 820 description:
821 name: pool 821 name: pool
822 sha256: "4177f68c237ea2128d1bee66ac17b2ce05ba3dbaafcbdd54c5d40a39d0b6b11c" 822 sha256: "4177f68c237ea2128d1bee66ac17b2ce05ba3dbaafcbdd54c5d40a39d0b6b11c"
823 - url: "https://pub.flutter-io.cn" 823 + url: "https://pub.dev"
824 source: hosted 824 source: hosted
825 version: "1.5.3" 825 version: "1.5.3"
826 posix: 826 posix:
@@ -828,7 +828,7 @@ packages: @@ -828,7 +828,7 @@ packages:
828 description: 828 description:
829 name: posix 829 name: posix
830 sha256: bc1bad54ad2b735816e31f8d4600cfde6c7839975085ddfbca48b6c9f7c4044e 830 sha256: bc1bad54ad2b735816e31f8d4600cfde6c7839975085ddfbca48b6c9f7c4044e
831 - url: "https://pub.flutter-io.cn" 831 + url: "https://pub.dev"
832 source: hosted 832 source: hosted
833 version: "6.5.2" 833 version: "6.5.2"
834 pretty_dio_logger: 834 pretty_dio_logger:
@@ -836,7 +836,7 @@ packages: @@ -836,7 +836,7 @@ packages:
836 description: 836 description:
837 name: pretty_dio_logger 837 name: pretty_dio_logger
838 sha256: "36f2101299786d567869493e2f5731de61ce130faa14679473b26905a92b6407" 838 sha256: "36f2101299786d567869493e2f5731de61ce130faa14679473b26905a92b6407"
839 - url: "https://pub.flutter-io.cn" 839 + url: "https://pub.dev"
840 source: hosted 840 source: hosted
841 version: "1.4.0" 841 version: "1.4.0"
842 pub_semver: 842 pub_semver:
@@ -844,7 +844,7 @@ packages: @@ -844,7 +844,7 @@ packages:
844 description: 844 description:
845 name: pub_semver 845 name: pub_semver
846 sha256: "261236774e8b1d69cfc6b9eabbc96c40f25e7a2d6b171f3385d4f65d5734fb24" 846 sha256: "261236774e8b1d69cfc6b9eabbc96c40f25e7a2d6b171f3385d4f65d5734fb24"
847 - url: "https://pub.flutter-io.cn" 847 + url: "https://pub.dev"
848 source: hosted 848 source: hosted
849 version: "2.2.1" 849 version: "2.2.1"
850 pubspec_parse: 850 pubspec_parse:
@@ -852,7 +852,7 @@ packages: @@ -852,7 +852,7 @@ packages:
852 description: 852 description:
853 name: pubspec_parse 853 name: pubspec_parse
854 sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" 854 sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082"
855 - url: "https://pub.flutter-io.cn" 855 + url: "https://pub.dev"
856 source: hosted 856 source: hosted
857 version: "1.5.0" 857 version: "1.5.0"
858 rxdart: 858 rxdart:
@@ -860,7 +860,7 @@ packages: @@ -860,7 +860,7 @@ packages:
860 description: 860 description:
861 name: rxdart 861 name: rxdart
862 sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" 862 sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962"
863 - url: "https://pub.flutter-io.cn" 863 + url: "https://pub.dev"
864 source: hosted 864 source: hosted
865 version: "0.28.0" 865 version: "0.28.0"
866 share_plus: 866 share_plus:
@@ -895,7 +895,7 @@ packages: @@ -895,7 +895,7 @@ packages:
895 description: 895 description:
896 name: shared_preferences_android 896 name: shared_preferences_android
897 sha256: "5bcf0772a761b04f8c6bf814721713de6f3e5d9d89caf8d3fe031b02a342379e" 897 sha256: "5bcf0772a761b04f8c6bf814721713de6f3e5d9d89caf8d3fe031b02a342379e"
898 - url: "https://pub.flutter-io.cn" 898 + url: "https://pub.dev"
899 source: hosted 899 source: hosted
900 version: "2.4.11" 900 version: "2.4.11"
901 shared_preferences_foundation: 901 shared_preferences_foundation:
@@ -903,7 +903,7 @@ packages: @@ -903,7 +903,7 @@ packages:
903 description: 903 description:
904 name: shared_preferences_foundation 904 name: shared_preferences_foundation
905 sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" 905 sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03"
906 - url: "https://pub.flutter-io.cn" 906 + url: "https://pub.dev"
907 source: hosted 907 source: hosted
908 version: "2.5.4" 908 version: "2.5.4"
909 shared_preferences_linux: 909 shared_preferences_linux:
@@ -911,7 +911,7 @@ packages: @@ -911,7 +911,7 @@ packages:
911 description: 911 description:
912 name: shared_preferences_linux 912 name: shared_preferences_linux
913 sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" 913 sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f"
914 - url: "https://pub.flutter-io.cn" 914 + url: "https://pub.dev"
915 source: hosted 915 source: hosted
916 version: "2.4.1" 916 version: "2.4.1"
917 shared_preferences_ohos: 917 shared_preferences_ohos:
@@ -928,7 +928,7 @@ packages: @@ -928,7 +928,7 @@ packages:
928 description: 928 description:
929 name: shared_preferences_platform_interface 929 name: shared_preferences_platform_interface
930 sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" 930 sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80"
931 - url: "https://pub.flutter-io.cn" 931 + url: "https://pub.dev"
932 source: hosted 932 source: hosted
933 version: "2.4.1" 933 version: "2.4.1"
934 shared_preferences_web: 934 shared_preferences_web:
@@ -936,7 +936,7 @@ packages: @@ -936,7 +936,7 @@ packages:
936 description: 936 description:
937 name: shared_preferences_web 937 name: shared_preferences_web
938 sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 938 sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019
939 - url: "https://pub.flutter-io.cn" 939 + url: "https://pub.dev"
940 source: hosted 940 source: hosted
941 version: "2.4.3" 941 version: "2.4.3"
942 shared_preferences_windows: 942 shared_preferences_windows:
@@ -944,7 +944,7 @@ packages: @@ -944,7 +944,7 @@ packages:
944 description: 944 description:
945 name: shared_preferences_windows 945 name: shared_preferences_windows
946 sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" 946 sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1"
947 - url: "https://pub.flutter-io.cn" 947 + url: "https://pub.dev"
948 source: hosted 948 source: hosted
949 version: "2.4.1" 949 version: "2.4.1"
950 shelf: 950 shelf:
@@ -952,7 +952,7 @@ packages: @@ -952,7 +952,7 @@ packages:
952 description: 952 description:
953 name: shelf 953 name: shelf
954 sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 954 sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12
955 - url: "https://pub.flutter-io.cn" 955 + url: "https://pub.dev"
956 source: hosted 956 source: hosted
957 version: "1.4.2" 957 version: "1.4.2"
958 shelf_web_socket: 958 shelf_web_socket:
@@ -960,7 +960,7 @@ packages: @@ -960,7 +960,7 @@ packages:
960 description: 960 description:
961 name: shelf_web_socket 961 name: shelf_web_socket
962 sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" 962 sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925"
963 - url: "https://pub.flutter-io.cn" 963 + url: "https://pub.dev"
964 source: hosted 964 source: hosted
965 version: "3.0.0" 965 version: "3.0.0"
966 simple_gesture_detector: 966 simple_gesture_detector:
@@ -968,7 +968,7 @@ packages: @@ -968,7 +968,7 @@ packages:
968 description: 968 description:
969 name: simple_gesture_detector 969 name: simple_gesture_detector
970 sha256: ba2cd5af24ff20a0b8d609cec3f40e5b0744d2a71804a2616ae086b9c19d19a3 970 sha256: ba2cd5af24ff20a0b8d609cec3f40e5b0744d2a71804a2616ae086b9c19d19a3
971 - url: "https://pub.flutter-io.cn" 971 + url: "https://pub.dev"
972 source: hosted 972 source: hosted
973 version: "0.2.1" 973 version: "0.2.1"
974 sky_engine: 974 sky_engine:
@@ -981,7 +981,7 @@ packages: @@ -981,7 +981,7 @@ packages:
981 description: 981 description:
982 name: source_span 982 name: source_span
983 sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" 983 sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
984 - url: "https://pub.flutter-io.cn" 984 + url: "https://pub.dev"
985 source: hosted 985 source: hosted
986 version: "1.10.0" 986 version: "1.10.0"
987 sqflite: 987 sqflite:
@@ -998,7 +998,7 @@ packages: @@ -998,7 +998,7 @@ packages:
998 description: 998 description:
999 name: sqflite_android 999 name: sqflite_android
1000 sha256: "78f489aab276260cdd26676d2169446c7ecd3484bbd5fead4ca14f3ed4dd9ee3" 1000 sha256: "78f489aab276260cdd26676d2169446c7ecd3484bbd5fead4ca14f3ed4dd9ee3"
1001 - url: "https://pub.flutter-io.cn" 1001 + url: "https://pub.dev"
1002 source: hosted 1002 source: hosted
1003 version: "2.4.0" 1003 version: "2.4.0"
1004 sqflite_common: 1004 sqflite_common:
@@ -1006,7 +1006,7 @@ packages: @@ -1006,7 +1006,7 @@ packages:
1006 description: 1006 description:
1007 name: sqflite_common 1007 name: sqflite_common
1008 sha256: "761b9740ecbd4d3e66b8916d784e581861fd3c3553eda85e167bc49fdb68f709" 1008 sha256: "761b9740ecbd4d3e66b8916d784e581861fd3c3553eda85e167bc49fdb68f709"
1009 - url: "https://pub.flutter-io.cn" 1009 + url: "https://pub.dev"
1010 source: hosted 1010 source: hosted
1011 version: "2.5.4+6" 1011 version: "2.5.4+6"
1012 sqflite_darwin: 1012 sqflite_darwin:
@@ -1014,7 +1014,7 @@ packages: @@ -1014,7 +1014,7 @@ packages:
1014 description: 1014 description:
1015 name: sqflite_darwin 1015 name: sqflite_darwin
1016 sha256: "22adfd9a2c7d634041e96d6241e6e1c8138ca6817018afc5d443fef91dcefa9c" 1016 sha256: "22adfd9a2c7d634041e96d6241e6e1c8138ca6817018afc5d443fef91dcefa9c"
1017 - url: "https://pub.flutter-io.cn" 1017 + url: "https://pub.dev"
1018 source: hosted 1018 source: hosted
1019 version: "2.4.1+1" 1019 version: "2.4.1+1"
1020 sqflite_ohos: 1020 sqflite_ohos:
@@ -1031,7 +1031,7 @@ packages: @@ -1031,7 +1031,7 @@ packages:
1031 description: 1031 description:
1032 name: sqflite_platform_interface 1032 name: sqflite_platform_interface
1033 sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" 1033 sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920"
1034 - url: "https://pub.flutter-io.cn" 1034 + url: "https://pub.dev"
1035 source: hosted 1035 source: hosted
1036 version: "2.4.0" 1036 version: "2.4.0"
1037 stack_trace: 1037 stack_trace:
@@ -1039,7 +1039,7 @@ packages: @@ -1039,7 +1039,7 @@ packages:
1039 description: 1039 description:
1040 name: stack_trace 1040 name: stack_trace
1041 sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" 1041 sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377"
1042 - url: "https://pub.flutter-io.cn" 1042 + url: "https://pub.dev"
1043 source: hosted 1043 source: hosted
1044 version: "1.12.0" 1044 version: "1.12.0"
1045 stream_channel: 1045 stream_channel:
@@ -1047,7 +1047,7 @@ packages: @@ -1047,7 +1047,7 @@ packages:
1047 description: 1047 description:
1048 name: stream_channel 1048 name: stream_channel
1049 sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 1049 sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
1050 - url: "https://pub.flutter-io.cn" 1050 + url: "https://pub.dev"
1051 source: hosted 1051 source: hosted
1052 version: "2.1.2" 1052 version: "2.1.2"
1053 stream_transform: 1053 stream_transform:
@@ -1055,7 +1055,7 @@ packages: @@ -1055,7 +1055,7 @@ packages:
1055 description: 1055 description:
1056 name: stream_transform 1056 name: stream_transform
1057 sha256: a00e5f18bffc764f923e7dec1038527f7fe7a1791361a7117f0358193f13d53a 1057 sha256: a00e5f18bffc764f923e7dec1038527f7fe7a1791361a7117f0358193f13d53a
1058 - url: "https://pub.flutter-io.cn" 1058 + url: "https://pub.dev"
1059 source: hosted 1059 source: hosted
1060 version: "2.1.2" 1060 version: "2.1.2"
1061 string_scanner: 1061 string_scanner:
@@ -1063,7 +1063,7 @@ packages: @@ -1063,7 +1063,7 @@ packages:
1063 description: 1063 description:
1064 name: string_scanner 1064 name: string_scanner
1065 sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" 1065 sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3"
1066 - url: "https://pub.flutter-io.cn" 1066 + url: "https://pub.dev"
1067 source: hosted 1067 source: hosted
1068 version: "1.3.0" 1068 version: "1.3.0"
1069 synchronized: 1069 synchronized:
@@ -1071,7 +1071,7 @@ packages: @@ -1071,7 +1071,7 @@ packages:
1071 description: 1071 description:
1072 name: synchronized 1072 name: synchronized
1073 sha256: "69fe30f3a8b04a0be0c15ae6490fc859a78ef4c43ae2dd5e8a623d45bfcf9225" 1073 sha256: "69fe30f3a8b04a0be0c15ae6490fc859a78ef4c43ae2dd5e8a623d45bfcf9225"
1074 - url: "https://pub.flutter-io.cn" 1074 + url: "https://pub.dev"
1075 source: hosted 1075 source: hosted
1076 version: "3.3.0+3" 1076 version: "3.3.0+3"
1077 table_calendar: 1077 table_calendar:
@@ -1079,7 +1079,7 @@ packages: @@ -1079,7 +1079,7 @@ packages:
1079 description: 1079 description:
1080 name: table_calendar 1080 name: table_calendar
1081 sha256: b2896b7c86adf3a4d9c911d860120fe3dbe03c85db43b22fd61f14ee78cdbb63 1081 sha256: b2896b7c86adf3a4d9c911d860120fe3dbe03c85db43b22fd61f14ee78cdbb63
1082 - url: "https://pub.flutter-io.cn" 1082 + url: "https://pub.dev"
1083 source: hosted 1083 source: hosted
1084 version: "3.1.3" 1084 version: "3.1.3"
1085 term_glyph: 1085 term_glyph:
@@ -1087,7 +1087,7 @@ packages: @@ -1087,7 +1087,7 @@ packages:
1087 description: 1087 description:
1088 name: term_glyph 1088 name: term_glyph
1089 sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 1089 sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
1090 - url: "https://pub.flutter-io.cn" 1090 + url: "https://pub.dev"
1091 source: hosted 1091 source: hosted
1092 version: "1.2.1" 1092 version: "1.2.1"
1093 test_api: 1093 test_api:
@@ -1095,7 +1095,7 @@ packages: @@ -1095,7 +1095,7 @@ packages:
1095 description: 1095 description:
1096 name: test_api 1096 name: test_api
1097 sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" 1097 sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c"
1098 - url: "https://pub.flutter-io.cn" 1098 + url: "https://pub.dev"
1099 source: hosted 1099 source: hosted
1100 version: "0.7.3" 1100 version: "0.7.3"
1101 thinking_analytics: 1101 thinking_analytics:
@@ -1103,7 +1103,7 @@ packages: @@ -1103,7 +1103,7 @@ packages:
1103 description: 1103 description:
1104 name: thinking_analytics 1104 name: thinking_analytics
1105 sha256: b01cac0b5482e71c1d75c44c77d27f427662cc65a77b7bc3c8b49617d7a01e02 1105 sha256: b01cac0b5482e71c1d75c44c77d27f427662cc65a77b7bc3c8b49617d7a01e02
1106 - url: "https://pub.flutter-io.cn" 1106 + url: "https://pub.dev"
1107 source: hosted 1107 source: hosted
1108 version: "3.3.3" 1108 version: "3.3.3"
1109 timing: 1109 timing:
@@ -1111,7 +1111,7 @@ packages: @@ -1111,7 +1111,7 @@ packages:
1111 description: 1111 description:
1112 name: timing 1112 name: timing
1113 sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe" 1113 sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe"
1114 - url: "https://pub.flutter-io.cn" 1114 + url: "https://pub.dev"
1115 source: hosted 1115 source: hosted
1116 version: "1.0.2" 1116 version: "1.0.2"
1117 typed_data: 1117 typed_data:
@@ -1119,7 +1119,7 @@ packages: @@ -1119,7 +1119,7 @@ packages:
1119 description: 1119 description:
1120 name: typed_data 1120 name: typed_data
1121 sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 1121 sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
1122 - url: "https://pub.flutter-io.cn" 1122 + url: "https://pub.dev"
1123 source: hosted 1123 source: hosted
1124 version: "1.4.0" 1124 version: "1.4.0"
1125 url_launcher_linux: 1125 url_launcher_linux:
@@ -1127,7 +1127,7 @@ packages: @@ -1127,7 +1127,7 @@ packages:
1127 description: 1127 description:
1128 name: url_launcher_linux 1128 name: url_launcher_linux
1129 sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" 1129 sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935"
1130 - url: "https://pub.flutter-io.cn" 1130 + url: "https://pub.dev"
1131 source: hosted 1131 source: hosted
1132 version: "3.2.1" 1132 version: "3.2.1"
1133 url_launcher_platform_interface: 1133 url_launcher_platform_interface:
@@ -1135,7 +1135,7 @@ packages: @@ -1135,7 +1135,7 @@ packages:
1135 description: 1135 description:
1136 name: url_launcher_platform_interface 1136 name: url_launcher_platform_interface
1137 sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" 1137 sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029"
1138 - url: "https://pub.flutter-io.cn" 1138 + url: "https://pub.dev"
1139 source: hosted 1139 source: hosted
1140 version: "2.3.2" 1140 version: "2.3.2"
1141 url_launcher_web: 1141 url_launcher_web:
@@ -1143,7 +1143,7 @@ packages: @@ -1143,7 +1143,7 @@ packages:
1143 description: 1143 description:
1144 name: url_launcher_web 1144 name: url_launcher_web
1145 sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2" 1145 sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2"
1146 - url: "https://pub.flutter-io.cn" 1146 + url: "https://pub.dev"
1147 source: hosted 1147 source: hosted
1148 version: "2.4.1" 1148 version: "2.4.1"
1149 url_launcher_windows: 1149 url_launcher_windows:
@@ -1151,7 +1151,7 @@ packages: @@ -1151,7 +1151,7 @@ packages:
1151 description: 1151 description:
1152 name: url_launcher_windows 1152 name: url_launcher_windows
1153 sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77" 1153 sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77"
1154 - url: "https://pub.flutter-io.cn" 1154 + url: "https://pub.dev"
1155 source: hosted 1155 source: hosted
1156 version: "3.1.4" 1156 version: "3.1.4"
1157 uuid: 1157 uuid:
@@ -1159,7 +1159,7 @@ packages: @@ -1159,7 +1159,7 @@ packages:
1159 description: 1159 description:
1160 name: uuid 1160 name: uuid
1161 sha256: "9b129329f58692f6e6578329498a8fe9fbe98f090beb764ffbb8ee2eadd01dcd" 1161 sha256: "9b129329f58692f6e6578329498a8fe9fbe98f090beb764ffbb8ee2eadd01dcd"
1162 - url: "https://pub.flutter-io.cn" 1162 + url: "https://pub.dev"
1163 source: hosted 1163 source: hosted
1164 version: "4.6.0" 1164 version: "4.6.0"
1165 vector_math: 1165 vector_math:
@@ -1167,7 +1167,7 @@ packages: @@ -1167,7 +1167,7 @@ packages:
1167 description: 1167 description:
1168 name: vector_math 1168 name: vector_math
1169 sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" 1169 sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
1170 - url: "https://pub.flutter-io.cn" 1170 + url: "https://pub.dev"
1171 source: hosted 1171 source: hosted
1172 version: "2.1.4" 1172 version: "2.1.4"
1173 video_thumbnail: 1173 video_thumbnail:
@@ -1175,7 +1175,7 @@ packages: @@ -1175,7 +1175,7 @@ packages:
1175 description: 1175 description:
1176 name: video_thumbnail 1176 name: video_thumbnail
1177 sha256: "181a0c205b353918954a881f53a3441476b9e301641688a581e0c13f00dc588b" 1177 sha256: "181a0c205b353918954a881f53a3441476b9e301641688a581e0c13f00dc588b"
1178 - url: "https://pub.flutter-io.cn" 1178 + url: "https://pub.dev"
1179 source: hosted 1179 source: hosted
1180 version: "0.5.6" 1180 version: "0.5.6"
1181 vm_service: 1181 vm_service:
@@ -1183,7 +1183,7 @@ packages: @@ -1183,7 +1183,7 @@ packages:
1183 description: 1183 description:
1184 name: vm_service 1184 name: vm_service
1185 sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b 1185 sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b
1186 - url: "https://pub.flutter-io.cn" 1186 + url: "https://pub.dev"
1187 source: hosted 1187 source: hosted
1188 version: "14.3.0" 1188 version: "14.3.0"
1189 watcher: 1189 watcher:
@@ -1191,7 +1191,7 @@ packages: @@ -1191,7 +1191,7 @@ packages:
1191 description: 1191 description:
1192 name: watcher 1192 name: watcher
1193 sha256: "1398c9f081a753f9226febe8900fce8f7d0a67163334e1c94a2438339d79d635" 1193 sha256: "1398c9f081a753f9226febe8900fce8f7d0a67163334e1c94a2438339d79d635"
1194 - url: "https://pub.flutter-io.cn" 1194 + url: "https://pub.dev"
1195 source: hosted 1195 source: hosted
1196 version: "1.2.1" 1196 version: "1.2.1"
1197 web: 1197 web:
@@ -1199,7 +1199,7 @@ packages: @@ -1199,7 +1199,7 @@ packages:
1199 description: 1199 description:
1200 name: web 1200 name: web
1201 sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" 1201 sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a"
1202 - url: "https://pub.flutter-io.cn" 1202 + url: "https://pub.dev"
1203 source: hosted 1203 source: hosted
1204 version: "1.1.1" 1204 version: "1.1.1"
1205 web_socket: 1205 web_socket:
@@ -1207,7 +1207,7 @@ packages: @@ -1207,7 +1207,7 @@ packages:
1207 description: 1207 description:
1208 name: web_socket 1208 name: web_socket
1209 sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" 1209 sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c"
1210 - url: "https://pub.flutter-io.cn" 1210 + url: "https://pub.dev"
1211 source: hosted 1211 source: hosted
1212 version: "1.0.1" 1212 version: "1.0.1"
1213 web_socket_channel: 1213 web_socket_channel:
@@ -1215,7 +1215,7 @@ packages: @@ -1215,7 +1215,7 @@ packages:
1215 description: 1215 description:
1216 name: web_socket_channel 1216 name: web_socket_channel
1217 sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 1217 sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8
1218 - url: "https://pub.flutter-io.cn" 1218 + url: "https://pub.dev"
1219 source: hosted 1219 source: hosted
1220 version: "3.0.3" 1220 version: "3.0.3"
1221 webview_flutter: 1221 webview_flutter:
@@ -1268,7 +1268,7 @@ packages: @@ -1268,7 +1268,7 @@ packages:
1268 description: 1268 description:
1269 name: win32 1269 name: win32
1270 sha256: daf97c9d80197ed7b619040e86c8ab9a9dad285e7671ee7390f9180cc828a51e 1270 sha256: daf97c9d80197ed7b619040e86c8ab9a9dad285e7671ee7390f9180cc828a51e
1271 - url: "https://pub.flutter-io.cn" 1271 + url: "https://pub.dev"
1272 source: hosted 1272 source: hosted
1273 version: "5.10.1" 1273 version: "5.10.1"
1274 xdg_directories: 1274 xdg_directories:
@@ -1276,7 +1276,7 @@ packages: @@ -1276,7 +1276,7 @@ packages:
1276 description: 1276 description:
1277 name: xdg_directories 1277 name: xdg_directories
1278 sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" 1278 sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15"
1279 - url: "https://pub.flutter-io.cn" 1279 + url: "https://pub.dev"
1280 source: hosted 1280 source: hosted
1281 version: "1.1.0" 1281 version: "1.1.0"
1282 yaml: 1282 yaml:
@@ -1284,7 +1284,7 @@ packages: @@ -1284,7 +1284,7 @@ packages:
1284 description: 1284 description:
1285 name: yaml 1285 name: yaml
1286 sha256: f67cdd8e07d3c6329146aaef1ba043542b3134c12489f553ca9a7435d1068aea 1286 sha256: f67cdd8e07d3c6329146aaef1ba043542b3134c12489f553ca9a7435d1068aea
1287 - url: "https://pub.flutter-io.cn" 1287 + url: "https://pub.dev"
1288 source: hosted 1288 source: hosted
1289 version: "3.1.4" 1289 version: "3.1.4"
1290 sdks: 1290 sdks:
@@ -399,7 +399,7 @@ void main() { @@ -399,7 +399,7 @@ void main() {
399 expect(toasts, hasLength(1)); 399 expect(toasts, hasLength(1));
400 expect( 400 expect(
401 toasts.single, 401 toasts.single,
402 - matches(RegExp(r'^【测试】本轮同步耗时0\.0 s、计算耗时\d+\.\d s$')), 402 + matches(RegExp(r'^【测试】获取数据耗时0\.0 s、计算耗时\d+\.\d s$')),
403 ); 403 );
404 }); 404 });
405 405