Commit 4b224044c956473f53265e84deec8ba88723205b

Authored by 常守达
1 parent d4e2fe7b

fix(today):UI、今天动态变化

... ... @@ -88,13 +88,13 @@ class TodayController extends GetMaterialController {
Rx<DateTime> firstSelectableDay = DateTime(
DateTime.now().year, DateTime.now().month - 6, DateTime.now().day)
.obs;
late final DateTime lastSelectableDay;
Rx<DateTime> lastSelectableDay = DateUtils.dateOnly(DateTime.now()).obs;
final selectedDate = DateTime.now().obs;
final focusedDay = DateTime.now().obs;
final scrollOffset = 0.0.obs;
final scrollController = ScrollController();
final isLoadingToday = false.obs;
final isLoadingToday = true.obs;
final showHealthDataAuthCardStatus = 1.obs;
final stressSubtitle = ''.obs;
bool _isFirstLoad = true;
... ... @@ -145,7 +145,6 @@ class TodayController extends GetMaterialController {
firstSelectableDay.value = DateUtils.dateOnly(
DateTime(today.year, today.month - 6, today.day),
);
lastSelectableDay = today;
selectedDate.value = today;
focusedDay.value = today;
... ... @@ -214,11 +213,11 @@ class TodayController extends GetMaterialController {
void changeDate(DateTime date, {DateTime? focused}) {
final normalizedDate = _clampDate(date);
if (!DateUtils.isSameDay(date, lastSelectableDay) &&
!_userStateService.isVip) {
toPremiumPage('今日-查看非当日数据');
return;
}
// if (!DateUtils.isSameDay(date, lastSelectableDay.value) &&
// !_userStateService.isVip) {
// toPremiumPage('今日-查看非当日数据');
// return;
// }
selectedDate.value = normalizedDate;
focusedDay.value = _clampDate(focused ?? normalizedDate);
}
... ... @@ -227,7 +226,8 @@ class TodayController extends GetMaterialController {
final normalizedDate = DateUtils.dateOnly(date);
if (normalizedDate.isBefore(firstSelectableDay.value))
return firstSelectableDay.value;
if (normalizedDate.isAfter(lastSelectableDay)) return lastSelectableDay;
if (normalizedDate.isAfter(lastSelectableDay.value))
return lastSelectableDay.value;
return normalizedDate;
}
... ... @@ -337,8 +337,8 @@ class TodayController extends GetMaterialController {
Future<void> checkHealthDataAuthCardVisible(
[HealthAuthorization? preResult]) async {
final firstTime = DateUtils.dateOnly(
DateTime(lastSelectableDay.year, lastSelectableDay.month - 6,
lastSelectableDay.day),
DateTime(lastSelectableDay.value.year, lastSelectableDay.value.month - 6,
lastSelectableDay.value.day),
);
if (isFriend) {
showHealthDataAuthCardStatus.value = 1;
... ... @@ -396,7 +396,7 @@ class TodayController extends GetMaterialController {
_clearRealTimeData();
final intDate = int.parse(DateFormat('yyyyMMdd').format(date));
final isToday = DateUtils.isSameDay(date, lastSelectableDay);
final isToday = DateUtils.isSameDay(date, lastSelectableDay.value);
stressSubtitle.value = (isFriend ? 'Ta' : '') +
(isToday ? l10n.overallStressLevelToday : l10n.stressLevelsOnThatDay);
switch (await _healthApi.getV2HealthData(friendUserId, intDate)) {
... ... @@ -449,6 +449,7 @@ class TodayController extends GetMaterialController {
hrvAnnotations.clear();
v2HealthData.value = null;
v2StressScore.value = null;
}
toTrendHrvPage() {
... ... @@ -637,6 +638,7 @@ class TodayController extends GetMaterialController {
super.didChangeAppLifecycleState(state);
if (state == AppLifecycleState.resumed) {
lastSelectableDay.value = DateUtils.dateOnly(DateTime.now());
checkAddFriendVisible();
checkHrvAdBannerVisible();
checkHealthDataAuthCardVisible();
... ... @@ -649,6 +651,8 @@ class TodayController extends GetMaterialController {
_isFirstLoad = false;
return;
}
lastSelectableDay.value = DateUtils.dateOnly(DateTime.now());
checkAddFriendVisible();
checkHrvAdBannerVisible();
checkHealthDataAuthCardVisible();
... ...
... ... @@ -101,7 +101,7 @@ class TodayTabBody extends StatelessWidget {
context, controller.selectedDate.value),
showBackToToday: !isSameDay(
controller.selectedDate.value,
controller.lastSelectableDay,
controller.lastSelectableDay.value,
),
onBackToToday: _backToToday,
onTapPremiumCard: () {
... ... @@ -231,7 +231,8 @@ class TodayTabBody extends StatelessWidget {
const SizedBox(height: 12),
_LatestHrvCard(controller: controller),
if (!controller.isFriend) measureHRVButton(context),
Padding(
Container(
alignment: Alignment.centerLeft,
padding: const EdgeInsets.symmetric(vertical: 12),
child: Text(
(controller.isFriend
... ... @@ -243,6 +244,7 @@ class TodayTabBody extends StatelessWidget {
fontSize: 16,
fontWeight: FontWeight.w600,
),
textAlign: TextAlign.start,
),
),
TodaySleepCard(controller: controller),
... ... @@ -309,15 +311,16 @@ class TodayTabBody extends StatelessWidget {
child: SizedBox(
height: _weekRowsHeight,
child: TableCalendar(
key: ValueKey(controller.firstSelectableDay.value),
key: ValueKey(
'${controller.firstSelectableDay.value}-${controller.lastSelectableDay.value}'),
calendarFormat: CalendarFormat.week,
headerVisible: false,
daysOfWeekHeight: _weekRowsHeight / 2,
rowHeight: _weekRowsHeight / 2,
focusedDay: controller.focusedDay.value,
firstDay: controller.firstSelectableDay.value,
lastDay: controller.lastSelectableDay,
currentDay: controller.lastSelectableDay,
lastDay: controller.lastSelectableDay.value,
currentDay: controller.lastSelectableDay.value,
locale: Localizations.localeOf(context).toString(),
startingDayOfWeek: _startingDayOfWeek(context),
availableCalendarFormats: const {
... ... @@ -371,7 +374,7 @@ class TodayTabBody extends StatelessWidget {
period: ReportPeriod.day,
selectedDate: controller.selectedDate.value,
weekStart: controller.selectedDate.value,
maxDate: controller.lastSelectableDay,
maxDate: controller.lastSelectableDay.value,
minDate: controller.firstSelectableDay.value,
);
if (picked != null) {
... ... @@ -415,7 +418,7 @@ class TodayTabBody extends StatelessWidget {
)
: null,
child: Text(
isSameDay(day, controller.lastSelectableDay)
isSameDay(day, controller.lastSelectableDay.value)
? l10n.todayOnWeeklyCalendar
: _weekdayText(context, day),
style: TextStyle(
... ... @@ -470,11 +473,11 @@ class TodayTabBody extends StatelessWidget {
}
void _backToToday() {
controller.changeDate(controller.lastSelectableDay);
controller.changeDate(controller.lastSelectableDay.value);
}
String _dateTitle(BuildContext context, DateTime selectedDay) {
final today = controller.lastSelectableDay;
final today = controller.lastSelectableDay.value;
if (isSameDay(selectedDay, today)) return context.l10n.today;
if (isSameDay(selectedDay, today.subtract(const Duration(days: 1)))) {
return context.l10n.yesterday;
... ... @@ -492,7 +495,7 @@ class TodayTabBody extends StatelessWidget {
bool _isAfterToday(DateTime day) {
final normalizedDay = DateUtils.dateOnly(day);
return normalizedDay.isAfter(controller.lastSelectableDay);
return normalizedDay.isAfter(controller.lastSelectableDay.value);
}
Color _calendarTextColor(
... ... @@ -562,7 +565,7 @@ class _LatestHrvCard extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'${l10n.mostRecent}$latestDataTimeText',
'${l10n.mostRecent}($latestDataTimeText)',
style: TextStyle(
color: colors.textSecondary,
fontSize: 12,
... ... @@ -582,7 +585,7 @@ class _LatestHrvCard extends StatelessWidget {
),
const SizedBox(width: 8),
Text(
'${latestHrv}ms · $stateStr',
'${latestHrv}ms·$stateStr',
style: TextStyle(
color: colors.textPrimary,
fontSize: 18,
... ...
... ... @@ -143,7 +143,7 @@ class TodayHrvChartCard extends StatelessWidget {
Widget _buildHeader(BuildContext context) {
var sameDay = DateUtils.isSameDay(
controller.selectedDate.value, controller.lastSelectableDay);
controller.selectedDate.value, controller.lastSelectableDay.value);
return Row(
children: [
... ... @@ -212,7 +212,7 @@ class TodayHrvChartCard extends StatelessWidget {
/// 例如当前 13:58 → 下一刻度 18:00 → 返回 18 * 3600 = 64800
double _maxChartSeconds() {
if (!DateUtils.isSameDay(
controller.selectedDate.value, controller.lastSelectableDay)) {
controller.selectedDate.value, controller.lastSelectableDay.value)) {
return 24 * 3600.0;
}
final now = DateTime.now();
... ...
... ... @@ -21,7 +21,7 @@ class TodayHrvNumberCard extends StatelessWidget {
),
child: Obx(() {
var sameDay = DateUtils.isSameDay(
controller.selectedDate.value, controller.lastSelectableDay);
controller.selectedDate.value, controller.lastSelectableDay.value);
var otherHrv = (sameDay
? context.l10n.todaySAverageHrv
... ...
... ... @@ -238,6 +238,8 @@ class V2StressScore {
String stateString() {
switch (state) {
case 0:
return l10n.waitingForData;
case 1:
return l10n.pressureOverload;
case 2:
... ... @@ -247,7 +249,7 @@ class V2StressScore {
case 4:
return l10n.inExcellentCondition;
}
return l10n.waitingForData;
return '';
}
String stateBg() {
... ...