Commit 298978903b34b08da24dc62b80b507e0e0b57496

Authored by 常守达
1 parent ccc6eada

feat(hw): 鸿蒙版文案修改

import 'package:doublefeel_flutter/app/utils/assets_helper.dart';
import 'package:doublefeel_flutter/app/utils/platform_compact.dart';
import 'package:doublefeel_flutter/core/services/thinking_data_service.dart';
import 'package:doublefeel_flutter/core/theme/app_theme.dart';
import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
... ... @@ -119,7 +120,7 @@ class _HrvInstructionCard extends StatelessWidget {
alignment: Alignment.topCenter,
children: [
Container(
constraints: const BoxConstraints(minHeight: 438),
constraints: BoxConstraints(minHeight: isOhos() ? 388 : 438),
margin: const EdgeInsets.only(top: 110),
padding: const EdgeInsets.fromLTRB(20, 78, 20, 20),
decoration: BoxDecoration(
... ... @@ -128,47 +129,97 @@ class _HrvInstructionCard extends StatelessWidget {
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
l10n.todayHrvMeasurementIntro,
style: TextStyle(
color: context.colors.textSecondary,
fontSize: 13,
height: 17 / 12,
fontWeight: FontWeight.w400,
),
),
const SizedBox(height: 18),
_InstructionStep(text: l10n.todayHrvMeasurementStep1),
const SizedBox(height: 8),
_InstructionStep(text: l10n.todayHrvMeasurementStep2),
const SizedBox(height: 8),
_InstructionStep(text: l10n.todayHrvMeasurementStep3),
const SizedBox(height: 8),
_InstructionStep(text: l10n.todayHrvMeasurementStep4),
const SizedBox(height: 8),
_InstructionStep(text: l10n.todayHrvMeasurementStep5),
const SizedBox(height: 16),
Text(
l10n.todayHrvMeasurementHint,
style: TextStyle(
color: context.colors.textSecondary,
fontSize: 13,
height: 17 / 12,
fontWeight: FontWeight.w400,
),
),
const SizedBox(height: 8),
Text(
l10n.todayHrvMeasurementWarning,
style: TextStyle(
color: context.colors.warning,
fontSize: 13,
height: 17 / 12,
fontWeight: FontWeight.w400,
),
),
],
children: isOhos()
? [
Center(
child: Text(
'操作步骤',
style: TextStyle(
color: const Color(0xFF0F0F11),
fontSize: 16,
fontWeight: FontWeight.w600,
),
),
),
SizedBox(height: 20),
Text(
'华为手表通常会在一天中自动更新压力和 HRV 数据。如果你希望立即手动触发一次新的测量,可以参考以下方法:',
style: TextStyle(
fontSize: 12,
fontFamily: 'HarmonyOS Sans SC',
fontWeight: FontWeight.w400,
color: context.colors.textSecondary,
),
),
const SizedBox(height: 12),
_InstructionStep(text: '1、戴紧智能手表,坐下来,保持心境平和'),
const SizedBox(height: 12),
_InstructionStep(
text:
'2、在手机上打开华为运动健康,在健康页下滑找到“情绪健康”板块,进入后点击最下方的“测量压力”'),
const SizedBox(height: 12),
_InstructionStep(text: '3、保持平稳的呼吸,等待1-3分钟'),
const SizedBox(height: 16),
Text(
'提示:数据源来自华为运动健康,在测量之后可能存在延迟或是数据未能同步的情况。如若出现上述情况,请重新测量并等待数据读取。',
style: TextStyle(
fontSize: 12,
fontFamily: 'HarmonyOS Sans SC',
fontWeight: FontWeight.w400,
color: context.colors.textSecondary,
),
),
const SizedBox(height: 16),
Text(
'注意:需打开健康里的权限,同时关闭省电模式。',
style: TextStyle(
color: context.colors.warning,
fontSize: 12,
fontWeight: FontWeight.w400,
),
)
]
: [
Text(
l10n.todayHrvMeasurementIntro,
style: TextStyle(
color: context.colors.textSecondary,
fontSize: 13,
height: 17 / 12,
fontWeight: FontWeight.w400,
),
),
const SizedBox(height: 18),
_InstructionStep(text: l10n.todayHrvMeasurementStep1),
const SizedBox(height: 8),
_InstructionStep(text: l10n.todayHrvMeasurementStep2),
const SizedBox(height: 8),
_InstructionStep(text: l10n.todayHrvMeasurementStep3),
const SizedBox(height: 8),
_InstructionStep(text: l10n.todayHrvMeasurementStep4),
const SizedBox(height: 8),
_InstructionStep(text: l10n.todayHrvMeasurementStep5),
const SizedBox(height: 16),
Text(
l10n.todayHrvMeasurementHint,
style: TextStyle(
color: context.colors.textSecondary,
fontSize: 13,
height: 17 / 12,
fontWeight: FontWeight.w400,
),
),
const SizedBox(height: 8),
Text(
l10n.todayHrvMeasurementWarning,
style: TextStyle(
color: context.colors.warning,
fontSize: 13,
height: 17 / 12,
fontWeight: FontWeight.w400,
),
),
],
),
),
Image.asset(
... ...
import 'package:doublefeel_flutter/app/modules/home/widgets/today/realtime_stress_explanation_bottom_sheet.dart';
import 'package:doublefeel_flutter/app/utils/platform_compact.dart';
import 'package:doublefeel_flutter/core/theme/app_theme.dart';
import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
import 'package:flutter/material.dart';
... ... @@ -95,12 +96,23 @@ class HrvPrincipleExplanationBottomSheet extends StatelessWidget {
_InfoCard(
title: l10n.todayHrvPrincipleHowMeasureTitle,
children: [
_InfoText(
l10n.todayHrvPrincipleHowMeasureDescription1,
),
_InfoText(
l10n.todayHrvPrincipleHowMeasureDescription2,
),
...isOhos()
? [
_InfoText(
'当你佩戴智能手表时,系统会自动采集你的心率与 HRV(心率变异性)等健康数据,并同步至华为健康。',
),
_InfoText(
'DoubleFeel 会基于这些数据,分析你的身体压力与恢复状态。',
),
]
: [
_InfoText(
l10n.todayHrvPrincipleHowMeasureDescription1,
),
_InfoText(
l10n.todayHrvPrincipleHowMeasureDescription2,
)
],
_InfoText(
l10n.todayHrvPrincipleHowMeasureDescription3,
),
... ... @@ -137,7 +149,7 @@ class HrvPrincipleExplanationBottomSheet extends StatelessWidget {
],
),
const SizedBox(height: 12),
const _FaqLinksCard(),
if (!isOhos()) const _FaqLinksCard(),
],
),
),
... ...
... ... @@ -49,8 +49,12 @@ class NoHealthDataPage extends StatelessWidget {
path: isOhos()
? 'assets/images/common/ic_hw_watch.png'
: 'assets/images/common/ic_apple_watch.webp',
title: context.l10n.noHealthDataError1Title,
body: context.l10n.noHealthDataError1Body,
title: isOhos()
? '错误1:智能手表数据不可用'
: context.l10n.noHealthDataError1Title,
body: isOhos()
? '看起来你最近没有正常使用只能手表,或手表尚未完成健康数据同步。如果你刚刚开启了压力、HRV 或心率权限,这种情况可能会出现。
请继续佩戴并连接智能手表,保持「华为运动健康」后台运行,等待新的健康数据同步;或在首页手动触发一次压力测试'
: context.l10n.noHealthDataError1Body,
),
const SizedBox(height: 12),
const _AuthorizationCard(),
... ... @@ -155,7 +159,7 @@ class _PageHeading extends StatelessWidget {
Padding(
padding: EdgeInsets.symmetric(horizontal: 21),
child: Text(
context.l10n.noHealthDataHeadingTitle,
isOhos() ? '无健康数据可用' : context.l10n.noHealthDataHeadingTitle,
textAlign: TextAlign.center,
style: TextStyle(
color: Color(0xFF14121E),
... ... @@ -169,7 +173,9 @@ class _PageHeading extends StatelessWidget {
Padding(
padding: EdgeInsets.symmetric(horizontal: 8),
child: Text(
context.l10n.noHealthDataHeadingBody,
isOhos()
? 'DoubleFeel 无法从「华为运动健康」获取你的 HRV 或压力数据。请按照下方步骤完成授权,然后点击右上角“刷新”继续。'
: context.l10n.noHealthDataHeadingBody,
textAlign: TextAlign.center,
style: TextStyle(
color: context.colors.textPrimary,
... ... @@ -267,7 +273,9 @@ class _AuthorizationCard extends StatelessWidget {
),
SizedBox(height: 6),
Text(
context.l10n.noHealthDataError2Body,
isOhos()
? 'DoubleFeel 需要访问华为运动健康数据,才能读取你的压力、HRV 与睡眠信息,否则部分功能可能无法正常使用。请放心,所有健康数据仅保存在本地,不会上传。'
: context.l10n.noHealthDataError2Body,
style: TextStyle(
color: context.colors.textSecondary,
fontSize: 12,
... ... @@ -277,7 +285,7 @@ class _AuthorizationCard extends StatelessWidget {
),
],
),
SizedBox(height: 37),
SizedBox(height: 17),
Image.asset(
assetCompatPath('assets/images/permission/apple_privacy_cn.png',
useOhosDir: true),
... ... @@ -341,7 +349,18 @@ class _SystemIssueCard extends StatelessWidget {
),
SizedBox(height: 6),
Text(
context.l10n.noHealthDataError3Body,
isOhos()
? '''
根据用户反馈,我们发现 HRV 或压力数据可能缺失的两个原因:
1. 智能手表未正常连接
• 如果你的华为手表长时间未连接,HRV、压力或心率数据可能无法同步。
• 请打开「华为运动健康 App」→「设备」,确认手表已连接并同步正常。
• 如果仍有问题,请尝试重新连接手表,并保持蓝牙开启与后台同步权限开启。
2. 最近健康数据缺失\n• 打开「华为运动健康 App」查看“压力”、“心率”或“睡眠”数据是否正常更新。\n• 如果最近长时间没有新数据,请继续佩戴手表,并尝试手动进行一次压力测试或呼吸训练。\n• 如果数据仍未恢复,请重启手表与手机后,再重新打开 DoubleFeel。
'''
: context.l10n.noHealthDataError3Body,
style: TextStyle(
color: context.colors.textSecondary,
fontSize: 12,
... ...
import 'package:doublefeel_flutter/app/modules/home/widgets/today/hrv_principle_explanation_bottom_sheet.dart';
import 'package:doublefeel_flutter/app/utils/platform_compact.dart';
import 'package:doublefeel_flutter/core/theme/app_theme.dart';
import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
import 'package:flutter/material.dart';
... ... @@ -138,13 +139,25 @@ class RealtimeStressExplanationBottomSheet extends StatelessWidget {
title: l10n.todayRealtimeStressLowBetterTitle,
children: [
_InfoText(l10n.todayRealtimeStressLowBetterNo),
SizedBox(
height: 12,
),
_InfoText(l10n.todayRealtimeStressLowBetterType),
SizedBox(
height: 12,
),
_InfoText(
l10n.todayRealtimeStressLowBetterExample,
),
SizedBox(
height: 12,
),
_InfoText(
l10n.todayRealtimeStressLowBetterHighStress,
),
SizedBox(
height: 12,
),
_InfoText(l10n.todayRealtimeStressLowBetterTrend),
],
),
... ... @@ -152,23 +165,42 @@ class RealtimeStressExplanationBottomSheet extends StatelessWidget {
_InfoCard(
title: l10n.todayRealtimeStressScenarioTitle,
children: [
_InfoText(
l10n.todayRealtimeStressScenarioHrvDefault,
),
_InfoText(
l10n.todayRealtimeStressScenarioRegionLimit,
...isOhos()
? [
_InfoText(
'在华为穿戴设备的默认设置下,HRV 通常会在静息、睡眠或低活动状态下自动更新。',
),
_InfoText(
'由于不同设备型号、系统策略与佩戴状态不同,HRV 的更新频率可能会存在差异。',
)
]
: [
_InfoText(
l10n.todayRealtimeStressScenarioHrvDefault,
),
_InfoText(
l10n.todayRealtimeStressScenarioRegionLimit,
)
],
SizedBox(
height: 12,
),
_InfoText(l10n.todayRealtimeStressScenarioIntro),
_InfoText(
l10n.todayRealtimeStressScenarioUpdateEvery6Min),
isOhos()
? _InfoText('· 实时压力每 6 分钟更新一次')
: _InfoText(
l10n.todayRealtimeStressScenarioUpdateEvery6Min),
_InfoText(l10n.todayRealtimeStressScenarioTimely),
_InfoText(
l10n.todayRealtimeStressScenarioConsistentTrend),
SizedBox(
height: 12,
),
_InfoText(l10n.todayRealtimeStressScenarioSummary),
],
),
const SizedBox(height: 12),
const _FaqLinksCard(),
if (!isOhos()) const _FaqLinksCard(),
],
),
),
... ...
import 'package:doublefeel_flutter/app/modules/home/widgets/today/hrv_principle_explanation_bottom_sheet.dart';
import 'package:doublefeel_flutter/app/modules/home/widgets/today/realtime_stress_explanation_bottom_sheet.dart';
import 'package:doublefeel_flutter/app/utils/platform_compact.dart';
import 'package:doublefeel_flutter/core/theme/app_theme.dart';
import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
import 'package:flutter/material.dart';
... ... @@ -147,28 +148,60 @@ class StressStatusExplanationBottomSheet extends StatelessWidget {
],
),
const SizedBox(height: 12),
_InfoCard(
title: l10n.todayStressStatusAppWatchDifferenceTitle,
children: [
_InfoText(l10n.todayStressStatusAppWatchDifferenceApp),
_InfoText(l10n.todayStressStatusAppWatchDifferenceWatch),
],
),
isOhos()
? _InfoCard(
title: '手机 App 与智能师表显示的压力状态有什么区别?',
children: [
_InfoText(
'手机 App 首页显示的是当天的综合压力状态,会综合分析 HRV、静息心率与整日身体趋势。'),
_InfoText('智能手表显示的通常是最近一次测量得到的即时身体状态,更适合快速查看当前变化。'),
_InfoText('由于不同设备的数据采样频率不同,手机与穿戴设备中的状态可能会存在短暂差异。'),
],
)
: _InfoCard(
title: l10n.todayStressStatusAppWatchDifferenceTitle,
children: [
_InfoText(
l10n.todayStressStatusAppWatchDifferenceApp),
_InfoText(
l10n.todayStressStatusAppWatchDifferenceWatch),
],
),
const SizedBox(height: 12),
_InfoCard(
title: l10n.todayStressStatusWaitingDataTitle,
children: [
_InfoText(l10n.todayStressStatusWaitingDataDescription1),
_InfoText(l10n.todayStressStatusWaitingDataDescription2),
_InfoText(l10n.todayStressStatusWaitingDataReasonsIntro),
_InfoText(l10n.todayStressStatusWaitingDataReason1),
_InfoText(l10n.todayStressStatusWaitingDataReason2),
_InfoText(l10n.todayStressStatusWaitingDataReason3),
_InfoText(l10n.todayStressStatusWaitingDataReason4),
...isOhos()
? [
_InfoText('请继续佩戴智能手表,并等待系统自动采集数据。'),
_InfoText(l10n
.todayStressStatusWaitingDataReasonsIntro),
_InfoText('1. HRV 数据采样不足'),
_InfoText('2. 缺少静息心率数据'),
_InfoText('3. 穿戴设备佩戴时间较短'),
_InfoText('4. 华为健康数据权限未开启'),
_InfoText('5. 当前处于运动或高活动状态'),
_InfoText('6. 设备暂未同步最新健康数据'),
]
: [
_InfoText(l10n
.todayStressStatusWaitingDataDescription2),
_InfoText(l10n
.todayStressStatusWaitingDataReasonsIntro),
_InfoText(
l10n.todayStressStatusWaitingDataReason1),
_InfoText(
l10n.todayStressStatusWaitingDataReason2),
_InfoText(
l10n.todayStressStatusWaitingDataReason3),
_InfoText(
l10n.todayStressStatusWaitingDataReason4),
]
],
),
const SizedBox(height: 12),
const _FaqLinksCard(),
if (!isOhos()) const _FaqLinksCard(),
],
),
),
... ...
import 'package:doublefeel_flutter/app/utils/platform_compact.dart';
import 'package:doublefeel_flutter/app/widget/circular_gradient_progress/combine.dart';
import 'package:doublefeel_flutter/core/theme/app_theme.dart';
import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
... ... @@ -144,21 +145,23 @@ class TodaySleepCard extends StatelessWidget {
width: 50,
height: 50,
margin: EdgeInsets.only(right: 6, left: 4),
child: CircularGradientCombineWidget(
size: 50,
duration: const Duration(seconds: 1),
sweepAngles: [sleepDurationProgress, sleepScoreProgress],
backgroundColors: const [
Color(0xFFF3F3F3),
Color(0xFFF3F3F3),
],
gradientColors: [
[context.colors.primary],
[context.colors.chartBlue],
],
centerCircleSizeRatio: 0.3,
gapRatio: 0.1,
interpolatedColorRatio: 1),
child: isOhos()
? SizedBox()
: CircularGradientCombineWidget(
size: 50,
duration: const Duration(seconds: 1),
sweepAngles: [sleepDurationProgress, sleepScoreProgress],
backgroundColors: const [
Color(0xFFF3F3F3),
Color(0xFFF3F3F3),
],
gradientColors: [
[context.colors.primary],
[context.colors.chartBlue],
],
centerCircleSizeRatio: 0.3,
gapRatio: 0.1,
interpolatedColorRatio: 1),
),
);
}),
... ... @@ -322,39 +325,43 @@ class TodayActivityCard extends StatelessWidget {
margin: EdgeInsets.only(right: 6, left: 4),
child: Stack(
children: [
Container(
decoration: BoxDecoration(
shape: BoxShape.circle,
color: context.colors.textPrimary,
),
),
CircularGradientCombineWidget(
size: 50,
duration: const Duration(seconds: 1),
centerCircleSizeRatio: 0.2,
gapRatio: 0.06,
sweepAngles: [
activityProgress,
exerciseProgress,
standProgress
],
backgroundColors: [
context.colors.chartPink.withOpacity(0.4),
context.colors.chartGreen.withOpacity(0.3),
context.colors.chartBlue.withOpacity(0.4),
],
gradientColors: [
[
context.colors.chartPink,
],
[
context.colors.chartGreen,
],
[
context.colors.chartBlue,
],
],
),
isOhos()
? SizedBox()
: Container(
decoration: BoxDecoration(
shape: BoxShape.circle,
color: context.colors.textPrimary,
),
),
isOhos()
? SizedBox()
: CircularGradientCombineWidget(
size: 50,
duration: const Duration(seconds: 1),
centerCircleSizeRatio: 0.2,
gapRatio: 0.06,
sweepAngles: [
activityProgress,
exerciseProgress,
standProgress
],
backgroundColors: [
context.colors.chartPink.withOpacity(0.4),
context.colors.chartGreen.withOpacity(0.3),
context.colors.chartBlue.withOpacity(0.4),
],
gradientColors: [
[
context.colors.chartPink,
],
[
context.colors.chartGreen,
],
[
context.colors.chartBlue,
],
],
),
],
),
),
... ...
... ... @@ -171,7 +171,6 @@ class LoginController extends GetxController {
}
}
void onGoogleLoginPressed() async {
try {
final result = await LoadingService.instance.run(() async {
... ... @@ -199,7 +198,6 @@ class LoginController extends GetxController {
return;
}
try {
// final code = await LoadingService.instance.run(
// () => WeChatHostApi().requestAuthorizationCode(),
// type: LoadingType.circular,
... ... @@ -224,7 +222,6 @@ class LoginController extends GetxController {
}
}
void onDebugPressed() {
Get.toNamed(AppRoutes.debugEnvironment);
}
... ...
... ... @@ -20,7 +20,10 @@ List<Widget> buildUserOnboardingPages(BuildContext context,
final l10n = context.l10n;
return [
_IntroPage(title: l10n.onboardingIntroTitle),
_IntroPage(
title: isOhos()
? 'DoubleFeel是专为智能手表打造的健康陪伴app'
: l10n.onboardingIntroTitle),
_SelectionPage(
pageIndex: 1,
title: l10n.onboardingStateQuestion,
... ... @@ -137,7 +140,10 @@ class _IntroPage extends StatelessWidget {
horizontalPadding: 0,
child: Column(
children: [
OnboardingTitleText(title),
OnboardingTitleText(
title,
maxWidth: 301,
),
const SizedBox(height: 12),
Image.asset(
assetCompatPath(
... ... @@ -584,7 +590,10 @@ class HealthPermissionPage extends StatelessWidget {
return OnboardingPageScrollBody(
child: Column(
children: [
OnboardingTitleText(l10n.onboardingHealthPermissionTitle),
OnboardingTitleText(
isOhos() ? '允许访问健康数据' : l10n.onboardingHealthPermissionTitle,
maxWidth: 301,
),
const SizedBox(height: 12),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 8),
... ... @@ -634,9 +643,11 @@ class _NotificationPermissionPage extends StatelessWidget {
child: Column(
children: [
OnboardingTitleText(
l10n.onboardingNotificationSubtitle.isNotEmpty
? '${l10n.onboardingNotificationTitle}\n${l10n.onboardingNotificationSubtitle}'
: l10n.onboardingNotificationTitle,
isOhos()
? '开启通知\n及时了解身体每一次异动'
: (l10n.onboardingNotificationSubtitle.isNotEmpty
? '${l10n.onboardingNotificationTitle}\n${l10n.onboardingNotificationSubtitle}'
: l10n.onboardingNotificationTitle),
maxWidth: 320,
),
const SizedBox(height: 12),
... ... @@ -645,7 +656,9 @@ class _NotificationPermissionPage extends StatelessWidget {
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8),
child: OnboardingBodyText(
l10n.onboardingNotificationBody,
isOhos()
? '智能手表数据更新后会及时提醒你,帮助你及时行动,改善压力状态'
: l10n.onboardingNotificationBody,
fontSize: 14,
),
),
... ...